我真的无法弄清楚这需要的语法,它可能来自我对类型如何工作的缺乏理解.
我想要一个类型DataPoint,它存储一个元组(x, dataval)或两个字段x和dataval(其中x是a Double,dataval是a Complex Double.
我想要一个Monad实例,它有:
instance Monad (DataPoint x dataval) where
return dataval = DataPoint 0.0 dataval
DataPoint x dataval >>= f = DataPoint x (f dataval)
Run Code Online (Sandbox Code Playgroud)
基本上,monad的"值"是dataval,而x只是容器的一部分.
我不认为我的语法是正确的.如果我将DataPoint定义为
data DataPoint x dataval = DataPoint { x :: Double
, dataval :: Complex Double }
Run Code Online (Sandbox Code Playgroud)
它应该工作,对吗?
只有我得到"善意的不匹配"
The first argument of `Monad' should have kind `* -> *',
but `DataPoint x dataval' has kind `*'
Run Code Online (Sandbox Code Playgroud)
任何人都可以帮助我获得我想要实现的功能/ monad吗?
在语法方面,它是
instance Monad (DataPoint x) where
-- etc
Run Code Online (Sandbox Code Playgroud)
虽然我分享了hammar的担忧,并认为你应该尝试将它变成Functor:
instance Functor (DataPoint x) where
-- etc
Run Code Online (Sandbox Code Playgroud)
你得到的那种错误
The first argument of `Monad' should have kind `* -> *',
but `DataPoint x dataval' has kind `*'
Run Code Online (Sandbox Code Playgroud)
是因为Monad并且Functor是适用于更高阶类型的类型类(与Monoid适用于简单类型的类型类比较).
例如IO Int,不是单子; IO ()是不是一个单子; IO 是一个单子.
我想要一个类型
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)}
Run Code Online (Sandbox Code Playgroud)