不确定如何使用`$`函数

ssm*_*ssm 1 haskell brackets operators

在尝试编写一个用于转置列表列表的函数时,我看到了一些非常好奇的东西.我试过了:

> let abc xs | null (head xs) = [] | otherwise = map head xs : abc $ map tail xs
Run Code Online (Sandbox Code Playgroud)

并得到一个错误.然后我尝试了:

> let abc xs | null (head xs) = [] | otherwise = map head xs : abc ( map tail xs )
> abc [[1,2,3], [4,5,6], [7,8,9]]
[[1,4,7],[2,5,8],[3,6,9]]
Run Code Online (Sandbox Code Playgroud)

我被引导相信$可以使用运算符而不是括号,而那更像是Haskellish.为什么我收到错误?

Sas*_* NF 9

运算符是可以应用于中缀位置的函数.$功能也是如此.

在Haskell中,您可以定义自己的函数,这些函数可以在参数之间的中缀位置使用.那么你也可以使用定义功能应用优先级和结合infix,infixr,infixl-也就是说,线索告诉编译器是否将a $ b $ c作为(a $ b) $ c,或a $ (b $ c).

优先级$是这样的,你的第一个表达式被解释为(map head xs : abc) $ ...

例如,要声明$为中缀,请将其名称放在():

($) :: (a->b) -> a -> b
f $ x = f x
Run Code Online (Sandbox Code Playgroud)

或组成:

(.) :: (b->c)->(a->b)->a->c
(f . g) x = f $ g x
Run Code Online (Sandbox Code Playgroud)

Arithemtic"运算符"也被定义为类Num中的中缀函数.

此外,您可以使用其他函数作为中缀,在应用程序站点的反引号中引用它们.有时它使表达看起来更漂亮:

f `map` xs == map f xs
Run Code Online (Sandbox Code Playgroud)

(不是在这种特殊情况下,它使它看起来很漂亮,只是为了展示一个简单的例子)

  • $绝对是Haskell报告的运营商.任何名称完全由符号组成的函数也是如此.但是,它不是一种特殊的语言关键字.声明运算符中缀也没有特殊的魔力.无论我定义`f $ x = ...`还是`($)fx = ...`,当它没有包含在表达式的paranthesis中时它仍然是中缀.在Haskell中获取中缀运算符的唯一方法是将表达式括在`\`\``中,例如`\`map \`` (7认同)
  • 当然,除了[它是一种特殊的语言关键词,带有特殊的打字魔法](http://stackoverflow.com/questions/20795747/haskells-is-a-magic-operator/20795832#20795832)并不是它(几乎永远都很重要. (2认同)