【发布时间】:2020-01-05 13:29:05
【问题描述】:
在解决 Haskell 课程中的 Monad 作业时,我完全陷入困境。有一个示例数据类型,我想为其定义特定于 Monad 的函数:
data MyMonad a = MyMonad { func :: String -> a }
instance Functor MyMonad where
fmap f (MyMonad x) = MyMonad (\a -> f (x a))
instance Applicative MyMonad where
pure x = MyMonad (\a -> x)
(MyMonad f) <*> (MyMonad g) = MyMonad (\a -> (f a)(g a))
instance Monad MyMonad where
return x = MyMonad (\a -> x)
MyMonad x >>= f = f (\a -> x a) --my wrong definition
一旦声明了 Functor 和 Applicative 实例,我会尝试对 Monad 做同样的事情,但是......我并没有更接近于理解如何将记录语法 func 放入 f 函数中.到目前为止,我认为bind 是一个函数,可以在将MyMonad 映射到f 之前获取x。这只是任何 Monad 的一个关键特性——能够将一些值从一种数据类型上下文放到另一个数据类型上下文中——据我所知。老实说,我知道 bind 在 Monad 实例中对 [a], Maybe 和其他几个永远存在的类型的定义。是的,我清楚地看到 Monad 类的共同目的是什么。但是,我需要在这种特定情况下获得任何建议,以增强我对处理记录之类的方式的理解。
【问题讨论】:
标签: haskell functional-programming monads