任何人都可以解释为什么这些函数有不同的类型吗?
fa xs x = filter (>x) xs
fb xs = \x -> filter (> x)
fc x = filter (> x)
我认为第一个有类型:Ord a => [a] - > a-> [a]但我不确定其余部分。有人可以帮我吗?谢谢;)
答案 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
检查它们。