Haskell记录语法让我感到不舒服


9

大多数Haskell语法具有纯净之美。但是记录语法看起来很丑。真不舒服 感觉与C有某种混合。它需要逗号和花括号。Haskell具有基于行的制表符分隔。因此,它看起来比原来要求的太冗长。为什么以这种方式设计?


4
对我来说,所有Haskell都觉得很奇怪。我能做什么?
Job

7
你并不孤单。不少人抱怨(当前的化身)记录。

Eonil:如果您确实讨厌记录语法,则可以使用{-#NoTraditionalRecordSyntax#-} GHC扩展名将其禁用。
DanielDíazCarrete 2014年

Answers:


8

尽管我不在设计委员会中,但我认为记录语法的形状与列表语法保持一致。模块导出语法也使用逗号,唯一实际使用布局的地方是顶层声明,where子句和do-notation。

最重要的是,给定

data Foo = Foo {bar :: Int, baz :: Int}

写作

fnord x = x { bar = 4 }

如果不使用大括号,则会与其余语法冲突,并使用布局,例如

fnord x = x
    bar = 4

会使语法非常脆弱。在错误的位置添加一个“位置”,您的代码意味着完全不同的东西。

如果您对Haskell中的记录状态不满意(并且您不会孤单),我建议您看看fclabels甚至精致的类型类黑客,例如HListgrapefruit-records(后两个都不是)为胆小的人,但也有疯狂的力量)

fclabels将允许您编写(是毫无意义的)

fnord = setL bar 4

以及

getBar = getL bar

在其实际存在的理由之上,它由标签组成:

 data Person = Person { _place  :: Place, ... }
 data Place = Place { _city :: String, ... }

 moveToAmsterdam :: Person -> Person
 moveToAmsterdam = setL (city . place) "Amsterdam"

嗯 是否setL意味着可变的?没有IO?这很难理解...
Eonil 2011年

2
根本不,您将获得一个记录的另一个(共享)副本,但更改了单个字段,就像记录语法一样。不涉及可变性或引用透明性的破坏。
barsoap 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.