所以我将我的问题分成4个部分,但首先是一些背景:
我对Monads感觉相对舒服,但对Arrows不太满意.我想我遇到的主要问题是,我看不出它们对它们有用.无论形式是否正确,我都理解Monads是一种工具,可以让我们从计算中引入副作用.因为它们将程序片段从纯值推广到用其他动作装箱的值.从我的霰弹枪"阅读所有论文"的方法来学习箭头,我遇到了两个相互矛盾的观点:
答:箭头比Monads更强大/是Monads的概括.haskell wiki的开头是"他们可以做monad所能做的一切,甚至更多.它们与具有静态组件的monad大致相当."
B.箭头是Monads的子集使用ArrowApply我们可以定义monad
在haskell.org上,我遇到了这个自由风格的功能,被称为"猫头鹰".
((.)$(.))
Run Code Online (Sandbox Code Playgroud)
它的类型签名是
(a -> b -> c) -> a -> (a1 -> b) -> a1 -> c.
这相当于
f a b c d = a b (c d)
并且显然是
((.)$(.)) (==) 1 (1+) 0
回报True.
所以我的问题是:
a1在类型签名是什么意思?它与a?有关吗?(==)某种函数相等运算符?因为0 (==) 0在GHCi中抛出错误.1 (1+) 0在这种情况下意味着什么?我不知道这甚至是一个有效的表达方式.True?我想到了一种在Haskell中表示代数数字作为近似流的方法.您可以通过一些根查找算法来完成此操作.但那没什么好玩的.所以你可以添加x多项式,减少问题,找到它的固定点.
所以如果你在Haskell中有一个函数就好
f :: Double -> Double
f x = x ^ 2 + x
Run Code Online (Sandbox Code Playgroud)
我从概念上理解为什么修复不起作用,也就是说,我可以很容易地验证它不起作用,但不是真正的最不固定的f?还有另一个简单的(如定义大小)定点函数可以工作吗?