Haskell desugaring有什么优势吗?

Haskell desugaring有什么优势吗?,haskell,monads,functor,syntactic-sugar,applicative,Haskell,Monads,Functor,Syntactic Sugar,Applicative,当我使用函子、单子和其他Hakell结构时,如果我的代码不仅仅是几行,我更喜欢使用一些语法上的糖分,比如do符号。这使我更容易遵循代码流程。除了风格偏好之外,使用脱糖块与糖化替代品相比,有什么真正的优势吗?没有。糖化的关键在于它完全符合脱糖版本,因此不可能有任何非风格优势。如果你习惯了去糖化的符号,这样你就可以在风格更清晰的时候使用它,但你不会得到任何性能上的好处或任何东西,因为代码是相同的。我认为人们把这个问题视为愚蠢是一件很遗憾的事,特别是因为与这里所表达的最强烈的观点相反,答案是是,因此避

当我使用函子、单子和其他Hakell结构时,如果我的代码不仅仅是几行,我更喜欢使用一些语法上的糖分,比如do符号。这使我更容易遵循代码流程。除了风格偏好之外,使用脱糖块与糖化替代品相比,有什么真正的优势吗?

没有。糖化的关键在于它完全符合脱糖版本,因此不可能有任何非风格优势。如果你习惯了去糖化的符号,这样你就可以在风格更清晰的时候使用它,但你不会得到任何性能上的好处或任何东西,因为代码是相同的。

我认为人们把这个问题视为愚蠢是一件很遗憾的事,特别是因为与这里所表达的最强烈的观点相反,答案是,因此避免使用do-sugar可能有好处。西蒙·马洛(Simon Marlow)在他的研究中给出了一个很好的例子。这是一个简短的、毫无疑问是残杀的版本——请看他的幻灯片以了解更多细节

以下是Facebook可能希望运行的查询示例:

numCommonFriends x y = do
    fx <- friendsOf x
    fy <- friendsOf y
    return (length (intersect fx fy))
numCommonFriends x y=do

fxDaniel从性能的角度主张去糖化,amalloy从可读性的角度反对去糖化

我认为,有时候,经过删减的版本更具可读性,即比较

echo :: IO ()
echo = do
  ln <- getLine
  putStrLn ln
echo::IO() echo=do
好的,我对OPs问题的解释是将do符号与其被删除的等价物进行比较,这类似于
friendsOf x>>=(\fx->friendsOf y>=(\fy->return(length(intersect fx fy)))
(或者使用
liftM2
)的更好的变体)。我必须承认,你的解释提供了一个更有趣的视角。我仍然不确定OP的意思是什么,但我们在这里主要不是为了帮助人们,而是为了记录知识,这绝对是Haskell程序员应该注意的。是的,applicative的优雅和清晰(在大多数情况下)是我使用它的动机,因为它最直接地类似于解析到树中时所做的操作。我没有真正考虑并行评估方面。谢谢你给了我这篇论文的指针。@MikeMenzel请记住并行评估就是一个例子;但是有很多例子,甚至是顺序计算,其中一元绑定比应用模拟的慢,甚至是慢是渐进的。这有一个缺点,即
putStrLn
出现在
getLine
之前,而前者执行得晚。要解决这个问题,比如说,
getLine>=putStrLn
,这就更具可读性了。@EartEngine如果您从“先运行这个,然后运行那个”的角度来考虑,这是正确的。我把它读为
putStrLn$getLine
,其中
$getLine
是我从
getLine
中得到的字符串,所以我读得更多的是“这是我要做的,这是输入的来源”。
echo :: IO ()
echo = do
  ln <- getLine
  putStrLn ln
echo :: IO ()
echo = putStrLn =<< getLine