Я действительно не могу понять синтаксис, необходимый для этого, и, вероятно, это связано с отсутствием понимания того, как работают типы.Реализация этой монады/типа в Haskell?
Я хочу тип DataPoint
, который хранит либо кортеж (x, dataval)
или два поля х и dataval (где х представляет собой Double
и dataval является Complex Double
Я хочу Monad
случая, когда он идет что-то вроде:.
instance Monad (DataPoint x dataval) where
return dataval = DataPoint 0.0 dataval
DataPoint x dataval >>= f = DataPoint x (f dataval)
в принципе, «значение» монады dataval, и х является лишь частью контейнера.
Я не думаю, что мой синтаксис правильно ты GH. Если я определяю DataPoint как
data DataPoint x dataval = DataPoint { x :: Double
, dataval :: Complex Double }
тогда он должен работать, не так ли?
только я получаю «рода несоответствие»
The first argument of `Monad' should have kind `* -> *',
but `DataPoint x dataval' has kind `*'
Может кто-нибудь помочь мне получить функциональность/монады Я пытаюсь для того чтобы достигнуть?
Этот тип данных не может быть монадой, и, похоже, не имеет смысла, чтобы она была одной из них. Что вы пытаетесь сделать здесь? – hammar
Я tr ying для хранения «dataval» вместе со значением x, связанным с ним. И затем с помощью 'DataPoint >> = f' применить' f' к 'dataval' и оставить' x' неизменным. –
Это похоже на простой функтор, за исключением того, что они должны поддерживать 'dataval' любого типа, а не просто' Complex Double'. Это может иметь смысл просто определить функцию типа «fmap» для вашего типа без использования классов типов вообще. – hammar