我想写一个表达式,它会给出一个与列表推导[x|x<-[1..100], x`mod`7==0]
相等的列表,但我老师要求我在这个程序中使用$
。
那么,我怎么能在这里使用$
?
PS:我是Haskell的新手,所以请更喜欢简单的表达方式。
答案 0 :(得分:2)
($)
位于具有类型签名
($) :: (a -> b) -> a -> b
这意味着它需要两个参数,首先是一个函数(a -> b)
(左边),它接受一个参数,一个由类型变量a
指定的类型的值。 ($)
的第二个参数(右侧)是由类型变量a
再次指定的单个值。然后($)
运算符只是将第二个参数应用于第一个参数。因此,举例(+2) $ 3
会给我们5
。
因此,如果你坚持做列表推导,你可以按照无点样式进行如下操作;
Prelude> [x|x<-[1..100], (== 0) . mod x $ 7]
[7,14,21,28,35,42,49,56,63,70,77,84,91,98]
或以更直接的方式
Prelude> filter ((==0) . (`mod` 7)) $ take 100 [1..]
[7,14,21,28,35,42,49,56,63,70,77,84,91,98]
答案 1 :(得分:1)
$只意味着“采取右边的任何东西,并将其作为参数传递给左边”。 例如:
map (`mod`7) (take 100 [1..])
map (`mod`7) $ take 100 [1..]
这两行是相同的,$只是意味着你可以避免第二次调用的括号。 这种看法毫无用处,但我对一个简单的例子没有更好的想法:)