在haskell中,(.)
函数的类型是:
(.) :: (b -> c) -> (a -> b) -> a -> c
(.) (.)
的类型是:
(.) (.) :: (a -> b -> c) -> a -> (a1 -> b) -> a1 -> c
我无法推断出结果,这是怎么做到的?
答案 0 :(得分:3)
(.) :: (b -> c) -> (a -> b) -> a -> c
让我们来看看吧。这个函数首先要做的是(b -> c)
(所以函数从b
到c
),很酷。通过添加一对(冗余)括号:
(.) :: (b -> c) -> ((a -> b) -> a -> c)
^-- I am b' ^-- I am c' -- (b' and c' not to have name clash)
第一部分,我们给了函数(即已经处理过):
(.) (.) :: (a -> b') -> a -> c'
-- after substituting stuff (b' and c')
(.) (.) :: (a -> (b -> c)) -> a -> ((a1 -> b) -> a1 -> c)
^-- of course a1 /= a
-- you could eliminate redundant parentheses
(.) (.) :: (a -> b -> c) -> a -> (a1 -> b) -> a1 -> c
-- wee
我希望这能解决它。重点是:类型推断很容易得到'一旦你得到它只是一个替代问题达到ghci自动推断。
ot:我们可以称之为古怪的算子boobs
。