Haskell for all:在组装记录时,更喜欢 do notation 而不是 Applicative 运算符 Haskell for all Monday, May 20, 2024 在组装记录时,更喜欢 do notation 而不是 Applicative 运算符 这是一篇简短的文章,解释了为什么在组装记录时应该更喜欢 do 表示法,而不是使用 Applicative 运算符(即 () / () )。
此建议既适用于实现 Monad 的类型构造函数(例如 IO ),也适用于实现 Applicative 但不实现 Monad 的类型构造函数(例如 optparse-applicative 包中的 Parser 类型构造函数)。
唯一的区别是,在后一种情况下,您需要启用 ApplicativeDo 语言扩展。
而不是这样做: data Person = Person { firstName :: String , lastName :: String } getPerson :: IO Person getPerson = Person getLine getLine … 你应该这样做: {-# LANGUAGE RecordWildCards #-} {-# OPTIONS_GHC -Werror=missing-fields #-} data Person = Person {firstName :: String , lastName :: String } getPerson :: IO Person getPerson = do firstName ( putStrLn “输入你的名字:” *> getLine ) ( putStrLn “输入你的姓氏:” *> getLine ) 表达式变得如此之大,以至于你最终不得不将其拆分为多行,但如果我们已经将其拆分为多行,那么为什么不使用 do 表示法呢。
getPerson :: IO Person getPerson = do putStrLn “输入你的名字:”firstName Person’ 和 ‘Person’ 预期:Bool -> String -> Person 实际:Bool -> String -> String -> Person • 可能原因:’Person’ 应用于太少的参数 在 ‘()’ 的第一个参数中,即 ‘Person’ 在 ‘()’ 的第一个参数中,即 ‘Person getLine’ 在表达式中: Person getLine getLine | | getPerson = Person 获取行^^^^^^ 示例。
}’ 在 ‘do’ 块的 stmt 中: return Person {。
来源:HackerNews New

