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

Jus*_* L. 3 monads haskell

我真的无法弄清楚这需要的语法,它可能来自我对类型如何工作的缺乏理解.

我想要一个类型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吗?

dav*_*420 7

在语法方面,它是

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)或两个字段xdataval(在哪里x是一个Doubledataval是一个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)

  • Functors和Monads是不同的类型.如果您还没有这样做,请阅读[Typeclassopedia](http://www.haskell.org/haskellwiki/Typeclassopedia)的前几章. (2认同)