如何将$表达式转换为“常规”表达式

时间:2019-05-08 18:10:39

标签: haskell

我已阅读Printing the values inside a tuple in Haskell,该解决方案有效。 我对这个问题的意图是通过将代码“翻译”成$个免费代码来了解$符号的含义。

showDetails :: (String, Int, Int) -> String
showDetails (name, uid, _) = "Your name is:" ++ name ++ " Your ID is: " ++ show uid

main = do 
    putStrLn . unlines . map showDetails $ [("A",100,1),("B",101,2)]

$如何告诉showDetails应用于列表元素(元组)? 该行的$免费版本是什么?

1 个答案:

答案 0 :(得分:5)

$只是函数应用程序:

f $ x = f x

那样放,看起来没用。但是它实际上有许多用途-最常见的用途之一是因为作为infix运算符,它的优先级低于其他任何用法。也就是说,在解析表达式时,Haskell将所有内容都放在其左侧(不包括另一个$)和所有内容都在其右侧(同样),并有效地将双方都放在括号中。

由于$f $ complicatedExpression相同,因此允许使用f (complicatedExpression)代替括号。因此,在您的示例中:

putStrLn . unlines . map showDetails $ [("A",100,1),("B",101,2)]

相同
(putStrLn . unlines . map showDetails) ([("A",100,1),("B",101,2)])

并且选择纯粹是文体偏好。但是大多数人更喜欢$,尤其是因为多个$比多重嵌套括号好得多。