函数 g = (.).(.) 的类型是什么?

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)). 为了清楚起见,我特意添加了一些括号。(.)表达式中有 的三个实例(.) . (.),因此使用不同字母的三个版本的类型会很方便。

\n
    \n
  • (.) :: (b -> c) -> ((a -> b) -> (a -> c))\xe2\x80\x93 的第一个实例(.)(.).(.)

    \n
  • \n
  • (.) :: (e -> f) -> ((d -> e) -> (d -> f))\xe2\x80\x93 的第二个实例(.)(.). (.)

    \n
  • \n
  • (.) :: (h -> i) -> ((g -> h) -> (g -> i))\xe2\x80\x93 的第三个实例(.)(.) .(.)

    \n
  • \n
\n

(.) . (.)相当于((.) (.)) (.),它先应用(.)(.),然后将第一次应用的结果应用到(.)

\n

第一个实例到第二个实例的应用

\n

将参数 ( ) 的类型与( )(e -> f) -> ((d -> e) -> (d -> f))的输入类型匹配:(.)b -> c

\n
b = (e -> f)\nc = ((d -> e) -> (d -> f))\n
Run Code Online (Sandbox Code Playgroud)\n

(.)然后将( )结果类型中的类型变量替换(a -> b) -> (a -> c)为参数中的匹配项:

\n
(.) (.) :: (a -> (e -> f)) -> (a -> ((d -> e) -> (d -> f)))\n
Run Code Online (Sandbox Code Playgroud)\n

将第一个应用的结果应用于第三个实例

\n

将参数 ( ) 的类型与( )(h -> i) -> ((g -> h) -> (g -> i))的输入类型匹配:(.) (.)a -> (e -> f)

\n
a = (h -> i)\ne = (g -> h)\nf = (g -> i)\n
Run Code Online (Sandbox Code Playgroud)\n

(.) (.)然后将( )结果类型中的类型变量替换a -> ((d -> e) -> (d -> f))为参数中的匹配项:

\n
(.) (.) (.) :: (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 -> hh -> i

\n