我真的无法弄清楚这需要的语法,这可能源于我对类型如何工作缺乏了解。
我想要一个类型DataPoint
,它存储元组(x, dataval)
或两个字段x和dataval(其中x是Double
,dataval是Complex Double
。< / p>
我想要一个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 `*'
任何人都可以帮助我获得我想要实现的功能/单子吗?
答案 0 :(得分:7)
就语法而言,它是
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
进行比较)。
e.g。 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)}