[英]Implementing this monad/type in Haskell?
我真的無法弄清楚這需要的語法,它可能來自我對類型如何工作的缺乏理解。
我想要一個類型DataPoint
,它存儲元組(x, dataval)
或兩個字段x和dataval(其中x是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)
基本上,monad的“值”是dataval,而x只是容器的一部分。
我不認為我的語法是正確的。 如果我將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 `*'
任何人都可以幫助我獲得我想要實現的功能/ monad嗎?
在語法方面,它是
instance Monad (DataPoint x) where
-- etc
雖然我分享了hammar的擔憂,並認為你應該嘗試將它變成Functor:
instance Functor (DataPoint x) where
-- etc
你得到的那種錯誤
The first argument of `Monad' should have kind `* -> *',
but `DataPoint x dataval' has kind `*'
是因為Monad
和Functor
是適用於更高階類型的類型類(與Monoid
,這是一個適用於簡單類型的類型類)。
例如IO Int
不是 monad; IO ()
不是 monad; IO
是一個monad。
我想要一個類型
DataPoint
,它存儲元組(x, dataval)
或兩個字段x
和dataval
(其中x
是Double
,dataval
是Complex Double
。
data DataPoint a = DataPoint {x :: Double,
dataval :: a}
instance Functor DataPoint where
fmap f dataPoint = DataPoint {x = x dataPoint,
dataval = f (dataval dataPoint)}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.