【发布时间】:2013-04-29 08:05:40
【问题描述】:
我真的无法弄清楚这需要的语法,这可能是由于我对类型的工作原理缺乏了解。
我想要一个类型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?
【问题讨论】:
-
这种数据类型不能成为一个单子,而且它似乎也没有意义。你想在这里完成什么?
-
我正在尝试存储“dataval”以及与之关联的 x 值。然后使用
DataPoint >>= f将f应用到dataval,保持x不变。 -
这听起来更像是一个普通的函子,除了它们必须支持
dataval是任何类型,而不仅仅是Complex Double。为您的类型定义一个类似fmap的函数而不涉及类型类可能更有意义。 -
那么我将如何实现/实例化呢?
-
谢谢你的建议,我想我有一些东西正在运行:) 你介意详细说明如何确定某个东西应该是函子还是单子?我不确定我是否理解理论上的区别。