Haskell函数返回值

时间:2017-02-15 11:48:52

标签: haskell

之间有什么区别
dotEx1 = map(+3) . filter (>100)

dotEx1 xs = map(+3) . filter (>100) xs

myFilter xs = filter (>100) xs 

myFilter = filter (>100) 

与isn&#ttt

相同
dotEx1 = map(+3) . filter (>100)

dotEx1 xs = map(+3) . filter (>100) xs

同样的?

3 个答案:

答案 0 :(得分:7)

.函数定义如下:

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

.运算符组成的函数必须接受一个参数。因此,

dotEx1 = map(+3) . filter (>100)

相同
dotEx1 xs = (map(+3) . filter (>100)) xs

答案 1 :(得分:4)

点运算符有签名:

R> methods(subset)
[1] subset.data.frame subset.default    subset.matrix    
see '?methods' for accessing help and source code

此处运算符使用 infix 。所以在您的第一个声明中,您实际上写过:

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

这是有道理的,因为dotEx1 = (.) (map (+3)) (filter (>100)) 有签名:filter (>100)(Num n,Ord n) => [n] -> [n]有签名map (+3)。如果你写了:

Num n => [n] -> [n]

然后dotEx1 xs = (.) (map (+3)) (filter (>100) xs) 具有签名filter (>100) xs,因此这是一个值(不是函数,或者可能是没有参数的函数)。因此不能使用点运算符(类型不匹配)。

非正式地,点运算符应该被赋予两个函数(Num n,Ord n) => [n]f,并且在 g之后生成一个应用了f 的函数应用于输入。但是g因此必须是一个带有一个论点的函数。

答案 2 :(得分:3)

点运算符的优先级较低,因为您想部分应用函数。也就是说,

map (+3) . filter (>100)

读作

(map (+3)) . (filter (>100))

通过扩展你得到

dotEx1 xs = (map (+3)) . (filter (>100) xs)

而不是

dotEx1 xs = (map (+3) . filter (>100)) xs

更易读的版本:

dotEx1 xs = map (+3) . filter (>100) $ xs