sha*_*har 4 haskell functional-programming functor
我最近正在学习Haskell,而我正在阅读"了解你是一个Haskell"中的Functors,我才知道
((->)r)
采用一个参数的函数也是Functors的一种方式.(.)
相当于fmap
所以根据我的理解,fmap有两个参数.首先是要应用的函数,第二个是函子.
但是,我对这个表达很困惑(.) (.) (.)
.这是两种成分的组合,具有类型(b -> c) -> (a1 -> a2 -> b) -> (a1 -> a2 -> c)
所以这是我的疑问.第一个(.)
有两个参数,第一个是组合函数本身.第二个参数也是组合函数.而组合函数本身并不是算子.那么这是一个有效的表达方式呢?
我相信我在这里遗漏了一些东西.有人可以填补空白并帮助我了解表达方式是否正确?
忽略Functor
实例((->) r)
; 这是无关紧要的.这里只有两个问题:类型(.)
,即
(.) :: (b -> c) -> (a -> b) -> a -> c
Run Code Online (Sandbox Code Playgroud)
,以及函数应用程序是左关联的这一事实.后者意味着与之(.) (.) (.)
相同((.) (.)) (.)
.
让我们首先尝试找到(.) (.)
(最左边的那些,如果你愿意的话).让我们写的第一类型(.)
的(b1 -> c1) -> (a1 -> b1) -> a1 -> c1
,第二个作为(b2 -> c2) -> (a2 -> b2) -> a2 -> c2
.我们应用第一个到第二个,这给了我们b1
现在(b2 -> c2)
和c1
是(a2 -> b2) -> a2 -> c2
.因此,我们有
(.) (.) :: (a1 -> (b2 -> c2)) -> a1 -> ((a2 -> b2) -> a2 -> c2)
Run Code Online (Sandbox Code Playgroud)
这可以简化为
(.) (.) :: (a1 -> b2 -> c2) -> a1 -> (a2 -> b2) -> a2 -> c2
Run Code Online (Sandbox Code Playgroud)
现在让我们将它应用到最后一个(.)
(最右边的一个,如果你愿意的话).如果有签名(b3 -> c3) -> (a3 -> b3) -> a3 -> c3
,那么我们可以看到,a1
必须(b3 -> c3)
,b2
必须是(a3 -> b3)
和c2
必须a3 -> c3
.从而,
((.) (.)) (.) :: (b3 -> c3) -> (a2 -> (a3 -> b3)) -> a2 -> a3 -> c3
Run Code Online (Sandbox Code Playgroud)
这是一样的
((.) (.)) (.) :: (b3 -> c3) -> (a2 -> a3 -> b3) -> (a2 -> a3 -> c3)
Run Code Online (Sandbox Code Playgroud)
如果您进行重命名,这与您在问题中的内容相同.
归档时间: |
|
查看次数: |
217 次 |
最近记录: |