之间有什么区别
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
同样的?
答案 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