我必须找出这些功能的类型
(.)(:) :: (a -> b) -> a -> [b] -> [b]
(:(.)) type error
((.):) ::
((:):) ::
(.)(.) ::
(.):: (b ->c )->(a->b)->a->c
(:) :: a->[a]->[a]
我不知道如何找到((。):)的类型。 这些是旧的考试问题,我正在努力学习如何在编写函数时查找类型。我只能解决第一个问题。
答案 0 :(得分:1)
(.)
的类型为(b -> c) -> (a -> b) -> a -> c
,(:)
的类型为a -> [a] -> [a]
。
(x:)
与\xs -> x : xs
相同。在您的情况下,x
为(.)
,因此类型为(.)
。
由此我们可以得出结论:((.):)
的类型为[(b -> c) -> (a -> b) -> a -> c] -> [(b -> c) -> (a -> b) -> a -> c]
。
GHCi验证了这一点:
Prelude> :t ((.):)
((.):)
:: [(b -> c) -> (a -> b) -> a -> c]
-> [(b -> c) -> (a -> b) -> a -> c]
答案 1 :(得分:1)
您只需使用编译器使用的相同统一算法(主要是)。首先,您应该将表达式重写为前缀形式,使用((.):)
示例:'是:
\p -> (:) (.) p
哪个eta-减少到
(:) (.)
现在
(:) :: a -> [a] -> [a]
(.) :: (y -> z) -> (x -> y) -> x -> z
因此您需要将(y -> z) -> (x -> y) -> x -> z
与a
统一起来,这会在(:)
的上下文中为(:) (.)
提供更具体的类型:
((y -> z) -> (x -> y) -> x -> z) -> [(y -> z) -> (x -> y) -> x -> z)] -> [(y -> z) -> (x -> y) -> x -> z)]
因为这是普通的功能应用程序,规则是
f :: a -> b
x :: a
f x :: b
现在(.)
的类型和专门的(:)
(中间)类型的第一个参数是相同的,您只需取消它们以获得(:) (.)
的结果类型:
[(y -> z) -> (x -> y) -> x -> z)] -> [(y -> z) -> (x -> y) -> x -> z)]