为什么这些函数在Haskell中有不同的类型?

时间:2014-03-23 18:00:00

标签: haskell types lambda functional-programming

任何人都可以解释为什么这些函数有不同的类型吗?

fa xs x = filter (>x) xs 
fb xs = \x -> filter (> x)
fc x = filter (> x)

我认为第一个有类型:Ord a => [a] - > a-> [a]但我不确定其余部分。有人可以帮我吗?谢谢;)

2 个答案:

答案 0 :(得分:8)

第一个类型为Ord a => [a] -> a -> [a],它会过滤输入列表以包含大于参数x的所有元素。

filter (> x)具有类型Ord a => [a] -> [a],即它定义了一个过滤列表以包含大于x的元素的函数。这个测量你的第二个函数有类型

Ord a => b -> (a -> ([a] -> [a]))

请注意,与第一个函数不同,此函数不使用输入xs,因此第一个参数可以是任何类型。

第三个类型为Ord a => a -> [a] -> [a]。这就像第一个,除了比较的参数首先出现在list参数之前。

答案 1 :(得分:3)

这些功能有以下类型:

fa :: Ord a => [a] -> a -> [a]
fa xs x = filter (>x) xs

fb :: Ord a => t -> a -> [a] -> [a]
fb xs = \x -> filter (> x)

fc :: Ord a => a -> [a] -> [a]
fc x = filter (> x)

第一个函数属于[a] -> a -> [a]类型,因为xs对应于列表,x对应于元素。 解决这个问题的关键是检查filter函数的类型:

ghci > :t filter
filter :: (a -> Bool) -> [a] -> [a]

因此xs作为过滤函数的第二个参数传递,因此它是列表类型。 x在函数(a -> bool)中传递,因此它是单个元素。从filter函数获得的结果也是列表类型。所以你的类型定义将如下所示:

[a] -> a -> [a]

您可以应用相同的逻辑来确定其余函数的类型定义。如果您对任何类型有疑问,只需在ghci中加载函数定义,然后使用:t function_name检查它们。