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))\nRun Code Online (Sandbox Code Playgroud)\n(.)然后将( )结果类型中的类型变量替换(a -> b) -> (a -> c)为参数中的匹配项:
(.) (.) :: (a -> (e -> f)) -> (a -> ((d -> e) -> (d -> f)))\nRun Code Online (Sandbox Code Playgroud)\n将参数 ( ) 的类型与( )(h -> i) -> ((g -> h) -> (g -> i))的输入类型匹配:(.) (.)a -> (e -> f)
a = (h -> i)\ne = (g -> h)\nf = (g -> i)\nRun Code Online (Sandbox Code Playgroud)\n(.) (.)然后将( )结果类型中的类型变量替换a -> ((d -> e) -> (d -> f))为参数中的匹配项:
(.) (.) (.) :: (h -> i) -> ((d -> (g -> h)) -> (d -> (g -> i)))\nRun Code Online (Sandbox Code Playgroud)\n它与问题中的类型相同,只是有更多的括号和不同的字母。如果我删除不必要的括号,结果如下:
\n(.) (.) (.) :: (h -> i) -> (d -> g -> h) -> d -> g -> i\nRun Code Online (Sandbox Code Playgroud)\n它有什么作用?它接受两个类型为d和的参数,对它们g应用一个类型的函数,然后对结果应用一个类型的函数。d -> g -> hh -> i
| 归档时间: |
|
| 查看次数: |
147 次 |
| 最近记录: |