Jam*_*mes 1 polymorphism haskell types function polymorphic-functions
我遇到过这个功能
iter p f x = if (p x) then x else (iter p f (f x))
Run Code Online (Sandbox Code Playgroud)
我以为我会自己定义多态类型来理解这个概念.
我的想法如下:
该函数有3个参数,所以我们有 t1 -> t2 -> t3 -> T
p正在if条件中使用bool,因此必须返回at1 = a -> Bool
f也是p因为它在else块中作为参数传递的类型相同t2 = a -> Bool
x正在if条件中使用,因此它必须返回bool t1 = a -> Bool
但是当我检查ghci中的类型时,他们给我的类型是
iter :: (t -> Bool) -> (t -> t) -> t -> t
有人可以解释一下这背后的原因.
谢谢
该函数有3个参数,所以我们有t1 - > t2 - > t3 - > T.
这是正确的起点.
p正在if条件中使用,所以它必须返回一个bool,因此t1 = a - > Bool
正确.
f也是与p相同的类型,因为它在else块中作为参数传递,因此t2 = a - > Bool
不正确.f永远不会以同样的方式使用p.在f正在应用的else块中x,结果作为最后一个参数传递给iter.从我们知道f x必须是同一类型x等等f :: a -> a.
x正在if条件中使用,所以它必须返回一个bool,因此t1 = a - > Bool
不正确.在if条件x中仅用作参数p.你在上面建立了p :: a -> Bool.因此x :: a.
但是当我检查ghci中的类型时,他们给我的类型是
iter ::(t - > Bool) - >(t - > t) - > t - > t
正确.你也可以写这个替换t用a是在符号一致的-我们用a上面:
iter :: (a -> Bool) -> (a -> a) -> a -> a
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
108 次 |
| 最近记录: |