在Haskell中实现这个monad /类型?

时间:2013-04-29 08:05:41

标签: haskell monads

我真的无法弄清楚这需要的语法,这可能源于我对类型如何工作缺乏了解。

我想要一个类型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 `*'

任何人都可以帮助我获得我想要实现的功能/单子吗?

1 个答案:

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

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

e.g。 IO Int 不是 monad; IO () 不是 monad; IO 是monad。


  

我想要一个DataPoint类型,它存储元组(x, dataval)或两个字段xdataval(其中xDouble }和datavalComplex Double

data DataPoint a = DataPoint {x :: Double,
                              dataval :: a}

instance Functor DataPoint where
    fmap f dataPoint = DataPoint {x = x dataPoint,
                                  dataval = f (dataval dataPoint)}