我正在尝试并且未能完成该traverse功能Data.Traversable.我无法理解其观点.由于我来自一个势在必行的背景,有人可以根据命令性循环向我解释一下吗?伪代码将非常感激.谢谢.
我觉得这个问题很傻,但是我已经想到了一段时间,我找不到任何答案.
所以问题是:为什么应用仿函数有副作用,但仿函数不能?
也许他们可以而且我从未注意到......?
S组合器的模拟是否可以仅使用标准函数(不通过公式定义)并且不使用lambda(匿名函数)在Haskell中表示?我期待它的类型(a -> b -> c) -> (a -> b) -> a -> c.
例如,K组合器的模拟就是const.
实际上我试图\f x -> f x x用标准函数来表达函数,但是不能想到任何标准的非线性函数(这是一个多次使用它的参数的函数).
我看到处处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,只是一个应用程序?
我最近发布了一个关于>>操作员的问题,因为尽管我已经阅读了 LYAH walk the linee 部分,但我的理解仍然存在一些差距。下面是我偶然发现的一些代码/MVE,因为它们引发了以下思考。我怎么能得到代码后面的输出?是否不会出现没有向绑定运算符提供参数的情况,因此无法str连接任何参数,否则它们会使用>>=定义中所示的绑定,并且结果不应该与预期的不相似结果如下:
import Control.Monad
import Data.List
data Value =
NoneVal
| IntVal Int
| ListVal [Value]
deriving (Eq, Show, Read)
data RErr = EBVar String | EBInt Int
deriving (Eq, Show)
newtype Compuptaton a = Computation {runComputation :: [(String, Value)] -> (Either RErr a, [String]) }
instance Monad Computation where
return a = Computation( \_ -> (Right a, []))
m >>= f = Computation(\env -> case runComputation m env of …Run Code Online (Sandbox Code Playgroud) haskell ×5
monads ×3
applicative ×2
side-effects ×2
combinators ×1
s-combinator ×1
traversal ×1