3

我真的无法弄清楚这样做所必需的语法,这可能是因为我对类型的工作方式缺乏了解。

我想要一个 type 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)

基本上,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 `*'

谁能帮我获得我想要实现的功能/单子?

4

1 回答 1

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 `*'

是因为MonadFunctor是适用于高阶类型的类型类(与 比较Monoid,适用于简单类型的类型类)。

egIO Int不是单子IO ()不是单子IO 一个单子。


我想要一个 type DataPoint,它存储一个元组(x, dataval)或两个字段xdataval(where xis a Doubleand datavalis a 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)}
于 2013-04-29T08:19:12.673 回答