【问题标题】:Implementing this monad/type in Haskell?在 Haskell 中实现这个单子/类型?
【发布时间】: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 >>= ff应用到dataval,保持x不变。
  • 这听起来更像是一个普通的函子,除了它们必须支持 dataval 是任何类型,而不仅仅是 Complex Double。为您的类型定义一个类似fmap 的函数而不涉及类型类可能更有意义。
  • 那么我将如何实现/实例化呢?
  • 谢谢你的建议,我想我有一些东西正在运行:) 你介意详细说明如何确定某个东西应该是函子还是单子?我不确定我是否理解理论上的区别。

标签: haskell monads


【解决方案1】:

就语法而言,它是

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 相比)。

例如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)}

【讨论】:

  • 谢谢,我想我已经运行了 :) 你介意详细说明函子和单子之间的区别吗?我还在想办法。
  • Functors 和 Monads 是不同的类型类。如果您还没有这样做,请阅读the Typeclassopedia 的前几章。
  • 感谢@ИльяРезвов 的编辑。其他人:这就是为什么你应该使用{-# LANGUAGE DeriveFunctor #-}deriving Functor:它减少了你可以犯愚蠢错误的代码量。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多