相关疑难解决方法(0)

Haskell中Monad与Applicative的区别

我刚才读从以下typeclassopedia约之间的差异MonadApplicative.我能理解,没有joinApplicative.但是下面的描述看起来含糊不清,我无法弄清楚monadic计算/动作的"结果"究竟是什么意思.所以,如果我把一个值放入Maybe,这使得一个monad,这个"计算"的结果是什么?

让我们更仔细地看一下(>> =)的类型.基本的直觉是它将两个计算组合成一个更大的计算.第一个参数ma是第一个计算.但是,如果第二个论点只是一个mb,那将是无聊的; 那么计算就无法相互交互(实际上,这正是Applicative的情况).因此,(>> =)的第二个参数具有类型a - > mb:这种类型的函数,给定第一次计算的结果,可以产生第二个要运行的计算....直观地说,正是这种能力使用先前计算的输出来决定接下来运行哪些计算使Monad比Applicative更强大.应用计算的结构是固定的,而Monad计算的结构可以基于中间结果而改变.

是否有一个具体的例子说明"能够使用先前计算的输出来决定接下来要运行的计算",Applicative没有?

monads haskell applicative

50
推荐指数
5
解决办法
1万
查看次数

我必须实现Applicative和Functor来实现Monad

我正在尝试实现Monad实例.作为一个更简单的示例,假设以下内容:

data Maybee a = Notheeng | Juust a 

instance Monad Maybee where
   return x = Juust x
   Notheeng >>= f = Notheeng
   Juust x >>= f = f x
   fail _ = Notheeng 
Run Code Online (Sandbox Code Playgroud)

据我所知,这应该是Maybe的标准实现.但是,这不会编译,因为编译器抱怨:

没有实例(Applicative Maybee)

同样,一旦给出Applicative,他就想要一个Functor实例.

所以:简单的问题:在我实现Monad之前,我是否必须始终实现Functor和Applicative?

monads haskell functor applicative fam-proposal

7
推荐指数
3
解决办法
680
查看次数

印在monad里面

我在haskell写作翻译.我想用monads做到这一点.我已经创建了解析器,所以我有很多函数:: State -> MyMonad State,我可以使用bind运行我的程序.m >>= inst1 >>= inst2.一切都很好,但我不知道如何使用那个monad用我的语言创建指令print(或read).

我不想要简单但丑陋的解决方案,比如保持字符串在State内打印,最后在main中打印.(如果我在打印时有无穷大怎么办?)我无法理解来自网络的关于monad功能部分的文本.有一些解释,如"在IO Monad中包装,它非常简单",但没有任何工作示例.几乎所有的印刷教程都是关于主要的印刷.

为了更好地解释问题,我准备了最小的"解释器"示例(如下).还有State就是Int,我的单子是AutomatM说明有型:: Int -> AutomatM Int.所以可能的指令是:

inc :: Int -> AutomatM Int
inc x = return (x+1)
Run Code Online (Sandbox Code Playgroud)

我设计它就像我想象的那样简单:

import Control.Applicative
import Control.Monad (liftM, ap)
import Control.Monad.IO.Class (MonadIO(..))
import System.IO

data AutomatM a = AutomatError | Running a

instance Show a => Show (AutomatM a) where
    show (AutomatError) = "AutomatError"
    show (Running a) = "Running …
Run Code Online (Sandbox Code Playgroud)

monads haskell functional-programming monad-transformers

1
推荐指数
1
解决办法
416
查看次数

Haskell,没有实例(Applicative M)

看看我的代码.ghci说

没有实例声明的超类引起的(Applicative M)实例在'Monad M'的实例声明中

我不明白这个错误,我不知道如何修复它.你可以帮帮我吗 ?

newtype M a = StOut (Stack -> (a, Stack, String))

unStOut (StOut f) = f
--unStout is used to extract the emeded function from monadic capsule

instance Monad M where
    return x = StOut (\n -> (x, n, ""))
    e >>= f = StOut (\n ->  let     (a, n1, s1) = (unStOut e) n
                                    (b, n2, s2) = (unStOut (f a)) n1
                            in      (b, n2, s1++s2))
Run Code Online (Sandbox Code Playgroud)

monads haskell compiler-errors

0
推荐指数
1
解决办法
473
查看次数