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.为什么我收到错误?
运算符是可以应用于中缀位置的函数.$功能也是如此.
在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)
(不是在这种特殊情况下,它使它看起来很漂亮,只是为了展示一个简单的例子)
| 归档时间: |
|
| 查看次数: |
222 次 |
| 最近记录: |