0 monads haskell functional-programming
我根据对Monads(https://www.youtube.com/watch?v=ZhuHCtR3xq8)的解释,编写了一个组成函数f和g的Monad .解释停在一个关键组成部分:组成一个函数(比如F)a -> ma与另一个(说G) a -> ma,您需要一种方法来转换ma到a,拿东西出来的单子容器的(否则怎么会进给量f的输出成g ??)并没有解决.
假设我们有f和g映射整数并返回一个Maybe:
f :: Int -> Maybe Int
f = \x -> (Just x)
g :: Int -> Maybe Int
g = \x -> (Just x)
Run Code Online (Sandbox Code Playgroud)
我想制作一个允许我编写f和g的Monad,以便可以评估(g o f)(x)(含义f(g(x))).为了使这个工作,我们需要一种方法来转换Maybe Int(f的输出),Int以便它可以发送到g.当Maybe容器中有值时,我们只需拉出值.当g的输出为Nothing时,我们可以考虑值0(我知道g的输出不能超过上面的g,但我们假设它可以用于另一个f).
这是我尝试定义执行此操作的Monad MyMonad失败的尝试:
f :: Int -> Maybe Int
f = \x -> (Just x)
g :: Int -> Maybe Int
g = \x -> (Just x)
data MyMonad a = Maybe a
instance Monad MyMonad where
return x = MyMonad x
Just x >>= (\x -> MyMonad (Just x))
Nothing >>= (\x -> MyMonad (Just 0))
Run Code Online (Sandbox Code Playgroud)
谁能澄清这里有什么问题?从教程中很难知道在函数内部进行模式匹配的正确方法是什么(在这里处理Just vs. Nothing的情况)以及梳理实例化Monad的所有不同语法.这个例子没有帮助(https://wiki.haskell.org/All_About_Monads#Maybe_a_monad):引入绑定后>>=的羊例子甚至不使用它,采用了组合子来代替.
当你第一次开始学习monad时,最容易学习的就是Identitymonad.看起来这就是你实际上想要实现的东西,但是你已经把这个词Maybe卡在那里的某个地方,并且它正在抛弃一切.(那,或者你实际上是在尝试实现Maybemonad,但你没有定义Just或Nothing在任何地方.)
如果MyMonad像Identitymonad那样,正确的定义是:
f :: Int -> MyMonad Int
f = \x -> MyIdentity x
g :: Int -> MyMonad Int
g = \x -> MyIdentity x
data MyMonad a = MyIdentity a
instance Monad MyMonad where
return x = MyIdentity x -- return = \x -> MyIdentity x
(MyIdentity x) >>= f = f x -- (>>=) = \(MyIdentity x) f -> f x
Run Code Online (Sandbox Code Playgroud)
如果MyMonad像Maybemonad那样,正确的定义是:
f :: Int -> MyMonad Int
f = \x -> MyJust x
g :: Int -> MyMonad Int
g = \x -> MyJust x
data MyMonad a = MyNothing | MyJust a
instance Monad MyMonad where
return x = MyJust x
(MyJust x) >>= f = f x
MyNothing >>= f = MyNothing
Run Code Online (Sandbox Code Playgroud)
(注意,要编译这些,您还需要为Functor和定义一个实例Applicative.)
PS定义>>=为Maybe使用lambda符号单子,你需要一个case表达式:
(>>=) = \m f -> case m of
MyJust x -> f x
MyNothing -> MyNothing
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
178 次 |
| 最近记录: |