操作员规则';s$在haskell中的使用情况
我尝试了操作员规则';s$在haskell中的使用情况,haskell,operator-precedence,Haskell,Operator Precedence,我尝试了$操作符,但遇到了一个奇怪的问题,我不明白发生了什么 f = double $ 3+4 但事实并非如此 f xs = xs !! $ length xs - 1 运算符$是否只能出现在函数名之后,而不能出现在运算符之后? 如果是这样的话,有没有一种不带括号的方法来编写下面的函数 f xs = xs !! (length xs - 1) 不能让两个运算符相邻,这是无效语法。这适用于所有操作员。所以xs!!$长度xs-1根本不起作用。如果不使用一些不值得使用的技巧并降低代码的可读性,那
$
操作符,但遇到了一个奇怪的问题,我不明白发生了什么
f = double $ 3+4
但事实并非如此
f xs = xs !! $ length xs - 1
运算符$
是否只能出现在函数名之后,而不能出现在运算符之后?
如果是这样的话,有没有一种不带括号的方法来编写下面的函数
f xs = xs !! (length xs - 1)
不能让两个运算符相邻,这是无效语法。这适用于所有操作员。所以
xs!!$长度xs-1
根本不起作用。如果不使用一些不值得使用的技巧并降低代码的可读性,那么就没有真正的好方法来消除该语句中的paren
$
操作符不必出现在函数名之后,但是您可以这样做
> let add x y = x + y
> add 1 $ add 2 $ add 3 4
Haskell中缀符号有问题,请避免这样做
f xs = (!!) xs $ length xs - 1
括号将中缀运算符转换为前缀函数。
f xs=xs!!(长度xs-1)
更为惯用。或者是fxs=(xs!!)$length xs-1
@Kata我同意,但是OP想要一个简单的方法来处理$
;这看起来更符合要求。f xs=(!!)xs$length xs-1非常好@tomas你也可以做(!!)xs。pred。length$xs
现在只是出于好奇:initmy xs=take(length xs-1)xs
有没有一种不用括号的方法来写这个呢?注意使用代码>总是次优的,尤其是遍历列表两次(首先计算长度,然后访问最后一个元素)是不好的。在本例中,您显然应该只使用。。。但我想这只是一个例子。小诡辩:一元负号不太正确,它可以出现在低优先级运算符之后。@ØrjanJohansen捕捉得好!像add1$-1
这样的方法当然有效。