Gol*_*man 0 haskell types functional-programming currying type-signature
我很难理解Haskell中类型签名背后的原因.
1)->据说是右关联的,是否意味着它可以用类似的方式理解,例如4 ^(2 ^(3 ^ 2))?
2)使用简单函数的类型签名,以表达我的疑惑(来解释我的理解是,我会用a,b,c来代替Num a => a的或Int的):
myAdd :: a -> b -> c
myAdd x y = x+y
Run Code Online (Sandbox Code Playgroud)
这意味着函数接受参数a并返回b最终返回的函数c
但它可以重写为:
myAdd :: (a->(b->c))
Run Code Online (Sandbox Code Playgroud)
由于大多数学习材料都表明c在我们的例子中是函数myAdd的结果,为什么根据括号的使用它表明第一个'操作'是b->c?如何从该类型签名推断出执行操作的顺序?
3)我被赋予了执行任务
map f xs
Run Code Online (Sandbox Code Playgroud)
使用 foldr,(.)和(:)导致:
map f xs = foldr ((:) . f) [] xs
Run Code Online (Sandbox Code Playgroud)
我对理解上述功能的工作没有任何问题,但我们再来一次 - 键入签名.如果我们假设,这名都是统一的这样类型的a代表,在所有合约相同类型的,现在看来,这c和d在来表示a和b.在数学中,类似的任务可能非常简单,但我如何在Haskell中处理它?
map :: (a -> b) -> [a] -> [b]
foldr :: (a -> c -> c) -> c -> [a] -> c
(:) :: b -> ([b] -> [b])
(.) :: (b -> d) -> (a -> b) -> a -> d
Run Code Online (Sandbox Code Playgroud)
使用你的符号,在
myAdd :: a -> b -> c
myAdd x y = x+y
Run Code Online (Sandbox Code Playgroud)
你正确地解释了类型,a -> (b->c)然后你继续建议b -> c先以某种方式完成计算.
当myAdd 2 10评估类似的东西时,功能评估是从左到右.
1)首先myAdd 2评估.该评价的结果是,它发送的给定数量的函数y来2 + y.实际上,定义myAdd是一样的
myAdd x = \y -> x+y
Run Code Online (Sandbox Code Playgroud)
2)然后将最后一个函数应用于10yield 的参数2 + 10 = 12
因此,右侧的结合性->的类型表达不对应于一个权在计算的左排序功能评价.事实上,功能评估是左关联的:myAdd 2 10与...相同(myAdd 2) 10.