我想换我围绕如何Haskell的头Control.Arrow的&&&我的作品,但怕我在迷路的边缘.
具体来说,我很困惑(作为初学者)如何从类型签名中理解其行为
(&&&) :: a b c -> a b c' -> a b (c, c')
Run Code Online (Sandbox Code Playgroud)
在
import Control.Arrow
(negate &&& (+5)) <$> [1,2,3]
Run Code Online (Sandbox Code Playgroud)
甚至只是
(negate &&& (+5)) 5
Run Code Online (Sandbox Code Playgroud)
例如,第一个参数是"失踪" b和c,而第二个是缺少公正c',结果看起来对我来说(c, c'),不是a b (c, c').
&&&在某种类型的背景下,有人可以告诉我如何运作吗?
JB.*_*JB. 10
我一直认为&&&是分裂和应用操作.你有一个箭头值,你将应用两个函数(对不起,箭头,但它适用于函数并使解释更容易),并保留两个结果,从而分割流.
死的简单例子:
?> (succ &&& pred) 42
(43,41)
Run Code Online (Sandbox Code Playgroud)
走在那里的类型,我们有
succ &&& pred :: Arrow a, Enum b => a b (b,b)
Run Code Online (Sandbox Code Playgroud)
一个更复杂的例子,它不是全部b:
show &&& (== 42) :: Arrow a, Show b, Eq b, Num b => a b (String,Bool)
Run Code Online (Sandbox Code Playgroud)
所以用简单的英语:&&&接受两个函数,并将它们组合成一个函数,它接受输入,将两个函数应用于它,并返回结果对.
但它是在箭头上定义的,而不是函数.然而它的工作方式完全相同:它需要两个箭头,并将它们组合成一个箭头,它接受输入,向它应用两个箭头,并返回结果对.
arrowOne :: Arrow a => a b c
arrowTwo :: Arrow a => a b c'
arrowOne &&& arrowTwo :: Arrow a => a b (c,c')
Run Code Online (Sandbox Code Playgroud)
附录:似乎让您感到困惑的部分原因是a类型是否仍出现在类型签名中.这里的经验法则是,它与你看到->in函数类型时的工作方式相同:只要它没有被应用,它就会显示出来.
我记得读过一些箭头文献,它们把箭头写成b ~> c(注意波浪线不是破折号)而不是a b c,使功能更平行.
签名说,
(&&&) :: Arrow a => a b c -> a b c' -> a b (c, c')
Run Code Online (Sandbox Code Playgroud)
并且(->)是Arrow类类的实例.因此,重写专用于(->)类型的签名:
(&&&) :: ((->) b c) -> ((->) b c') -> ((->) b (c, c'))
Run Code Online (Sandbox Code Playgroud)
在,中缀形式它将看起来像:
(b -> c) -> (b -> c') -> (b -> (c, c'))
Run Code Online (Sandbox Code Playgroud)
这只是意味着
(&&&) :: (b -> c) -- given a function from type `b` to type `c`
-> (b -> c') -- and another function from type `b` to type `c'`
-> (b -> (c, c')) -- returns a function which combines the result of
-- first and second function into a tuple
Run Code Online (Sandbox Code Playgroud)
简单的复制将是:
(&:&) :: ((->) b c) -> ((->) b c') -> ((->) b (c, c'))
f &:& g = \x -> (f x, g x)
Run Code Online (Sandbox Code Playgroud)
这将以相同的方式工作:
\> (negate &:& (+5)) <$> [1, 2, 3]
[(-1,6),(-2,7),(-3,8)]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
607 次 |
| 最近记录: |