Dav*_*ves 0 haskell types type-inference currying parametric-polymorphism
答案是:(a -> b) -> (c -> d -> a) -> c -> d -> b
但我不知道怎么去那里。
小智 5
(.)
有类型(b -> c) -> ((a -> b) -> (a -> c))
. 为了清楚起见,我特意添加了一些括号。(.)
表达式中有 的三个实例(.) . (.)
,因此使用不同字母的三个版本的类型会很方便。
(.) :: (b -> c) -> ((a -> b) -> (a -> c))
\xe2\x80\x93 的第一个实例(.)
:(.)
.
(.)
(.) :: (e -> f) -> ((d -> e) -> (d -> f))
\xe2\x80\x93 的第二个实例(.)
:(.)
. (.)
(.) :: (h -> i) -> ((g -> h) -> (g -> i))
\xe2\x80\x93 的第三个实例(.)
:(.) .
(.)
(.) . (.)
相当于((.) (.)) (.)
,它先应用(.)
到(.)
,然后将第一次应用的结果应用到(.)
。
将参数 ( ) 的类型与( )(e -> f) -> ((d -> e) -> (d -> f))
的输入类型匹配:(.)
b -> c
b = (e -> f)\nc = ((d -> e) -> (d -> f))\n
Run Code Online (Sandbox Code Playgroud)\n(.)
然后将( )结果类型中的类型变量替换(a -> b) -> (a -> c)
为参数中的匹配项:
(.) (.) :: (a -> (e -> f)) -> (a -> ((d -> e) -> (d -> f)))\n
Run Code Online (Sandbox Code Playgroud)\n将参数 ( ) 的类型与( )(h -> i) -> ((g -> h) -> (g -> i))
的输入类型匹配:(.) (.)
a -> (e -> f)
a = (h -> i)\ne = (g -> h)\nf = (g -> i)\n
Run Code Online (Sandbox Code Playgroud)\n(.) (.)
然后将( )结果类型中的类型变量替换a -> ((d -> e) -> (d -> f))
为参数中的匹配项:
(.) (.) (.) :: (h -> i) -> ((d -> (g -> h)) -> (d -> (g -> i)))\n
Run Code Online (Sandbox Code Playgroud)\n它与问题中的类型相同,只是有更多的括号和不同的字母。如果我删除不必要的括号,结果如下:
\n(.) (.) (.) :: (h -> i) -> (d -> g -> h) -> d -> g -> i\n
Run Code Online (Sandbox Code Playgroud)\n它有什么作用?它接受两个类型为d
和的参数,对它们g
应用一个类型的函数,然后对结果应用一个类型的函数。d -> g -> h
h -> i
归档时间: |
|
查看次数: |
147 次 |
最近记录: |