Haskell语言的糖语法处理

3

Shuklan的Haskell讲座要求对以下代码进行解糖:

main = do
  putStrLn "Enter name:"
  name <- getLine
  putStrLn ("Hi " ++ name)

我想出了以下内容:
main = putStrLn "Enter name:" >> getLine >>= \str -> putStrLn ("Hi " ++ str)

他透露:
main = putStrLn "Enter name:" >> getLine >>= putStrLn . ("Hi " ++)

我从未见过这种语法,请问它是如何工作的?


实际上,就绑定的变量而言,你的风格更准确,但两种写法都可以。 - AJF
3
您的版本是正确的“去糖化”(desugaring)。所提供的答案做了额外的工作。 - Rein Henrichs
1
Desugaring不执行pointfree转换。将\str -> putStrLn ("Hi " ++ str)替换为putStrLn . ("Hi " ++) 是在desugaring规则中未指定的额外工作。 - Rein Henrichs
1个回答

8
以下是翻译的结果:

这两个片段是相同的,后者只是使用了point free风格(也被称为“无意义风格”)。

关键在于("Hi " ++)是部分应用的(++),它将"Hi "附加到输入参数之前。

使用.组合此函数和putStrLn,得到一个将“Hi”附加到输入参数并打印输出的函数。

这正是您更明确的lambda函数所做的。


应该对我来说很明显,我想太多了。谢谢。 - Ori

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接