Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
操作员规则';s$在haskell中的使用情况_Haskell_Operator Precedence - Fatal编程技术网

操作员规则';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
这样的方法当然有效。