组成时标准前奏函数的类型

时间:2013-12-15 10:47:07

标签: haskell

我必须找出这些功能的类型

(.)(:) :: (a -> b) -> a -> [b] -> [b]
(:(.)) type error
((.):) ::
((:):) :: 
(.)(.) ::

(.):: (b ->c )->(a->b)->a->c
(:) :: a->[a]->[a]

我不知道如何找到((。):)的类型。 这些是旧的考试问题,我正在努力学习如何在编写函数时查找类型。我只能解决第一个问题。

2 个答案:

答案 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 -> za统一起来,这会在(:)的上下文中为(:) (.)提供更具体的类型:

((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)]
相关问题