我看到处处Applicative可以处理副作用,但我见过的所有简单例子都是将各种东西组合在一起,如:
> (,,) <$> [1,2] <*> ["a", "b", "c"] <*> ["foo", "bar"]
[(1,"a","foo"),(1,"a","bar"),(1,"b","foo"),(1,"b","bar"),
(1,"c","foo"),(1,"c","bar"),(2,"a","foo"),(2,"a","bar"),
(2,"b","foo"),(2,"b","bar"),(2,"c","foo"),(2,"c","bar")]
Run Code Online (Sandbox Code Playgroud)
哪个很酷,但我看不出它与副作用有何联系.我的理解是,它Applicative是一个弱单子,所以你可以处理副作用(就像你对State monad一样),但你不能重复使用前一个副作用的结果.
这是否意味着>>可以写出Applicative类似的东西
do
print' "hello"
print' "world"
Run Code Online (Sandbox Code Playgroud)
会有意义(有print' :: a -> Applicative something)(使用适当的do-applicative扩展名).
在另一个世界,之间的区别Monad,并Applicative是Monad允许x <- ...,但Applicative没有.
然后,是作家monad,只是一个应用程序?
我对Haskell非常陌生,对语言的"架构"印象深刻,但是我仍然困扰着monad是如何纯粹的.
由于你有任何指令序列,它使它成为一个不纯的函数,尤其是 I/O函数从任何角度来看都不是纯粹的.
是因为Haskell像所有纯函数一样假设IO函数也有返回值,但是以操作码的形式还是什么?我真的很困惑.
我正在阅读"了解你是一个很好的Haskell!" 并且我对某个代码块的评估的解释感到磕磕绊绊.我已多次阅读这些解释,并开始怀疑即使是作者也能理解这段代码的作用.
ghci> (+) <$> (+3) <*> (*100) $ 5
508
Run Code Online (Sandbox Code Playgroud)
应用程序函数在某些上下文中将函数应用于某个上下文中的值,以在某些上下文中获得某些结果.我花了几个小时来研究这个代码块,并对这个表达式的评估方式提出了一些解释,但没有一个是令人满意的.我知道(5 + 3)+(5*100)是508,但问题是这个表达式.有没有人对这段代码有明确的解释?
instance Monad ((->) r) where
return x = \_ -> x
h >>= f = \w -> f (h w) w
import Control.Monad.Instances
addStuff :: Int -> Int
addStuff = do
a <- (*2)
b <- (+10)
return (a+b)
Run Code Online (Sandbox Code Playgroud)
我试图通过展开 do 符号来理解这个 monad,因为我认为 do 符号隐藏了发生的事情。
如果我理解正确,会发生以下情况:
(*2) >>= (\a -> (+10) >>= (\b -> return (a+b)))
Run Code Online (Sandbox Code Playgroud)
现在,如果我们采用 for 的规则>>=,我们必须理解(*2)ash和(\a -> (+10) >>= (\b -> return (a+b)))as f。应用h到w很容易,让我们只说这是 …