这个答案只是我在这个问题上的一些随机想法。我推荐我的另一个答案,因为为了这个答案,我花了很多时间去查阅和参考其他人的工作。
记录语法
以在黑暗中的几个刺:你的“布局为基础”的提出语法看起来很像非记录语法data
声明;这可能会引起混淆解析(?)
--record
data Foo = Foo {i :: Int, s :: String} deriving (Show)
--non-record
data Foo = Foo Int String deriving (Show)
--new-record
data Foo = Foo i :: Int, s :: String deriving (Show)
--record
data LotsaInts = LI {a,b,c,i,j,k :: Int}
--new-record
data LostaInts = LI a,b,c,i,j,k :: Int
在后一种情况下,究竟是什么:: Int
应用?整个数据声明?
带有记录语法(当前)的声明与构造和更新语法类似。对于这些情况,基于布局的语法而不是更清晰;你如何解析那些额外的=
标志?
let f1 = Foo {s = "foo1", i = 1}
let f2 = f1 {s = "foo2"}
let f1 = Foo s = "foo1", i = "foo2"
let f2 = f1 s = "foo2"
你怎么知道f1 s
是一个记录更新,而不是一个函数应用程序?
命名空间
如果你想交融的使用你的类定义与前奏的id
id
?你如何指定你正在使用哪一个?你能想到比合格进口和/或hiding
关键字更好的方法吗?
import Prelude hiding (id)
data Foo = Foo {a,b,c,i,j,k :: Int, s :: String}
deriving (Show)
id = i
ghci> :l data.hs
ghci> let foo = Foo 1 2 3 4 5 6 "foo"
ghci> id foo
4
ghci> Prelude.id f1
Foo {a = 1, b = 2, c = 3, i = 4, j = 5, k = 6, s = "foo"}
这些都不是伟大的答案,但他们是我已经得到了最好。我个人不认为记录语法是那丑。我确实觉得使用命名空间/模块的东西还有改进的空间,但我不知道如何使它变得更好。
的语法是好的 - 什么是“疣”存在的事实,记录是不可扩展的(人们希望更多的权力)和名字空间的问题更在于。正如我习惯了常规语法,其中一种情况是我更喜欢它布局语法 - 也许没有人考虑过Haskell设计时的布局语法? “基于类型的名称解析”TBNR已被提出用于第二个问题 - 许多人似乎认为它存在语义上的问题(这不利于该提案几乎没有说服力的书写),但GHC-HQ的一名成员似乎喜欢它,所以它可能会出现。 – 2011-03-20 08:41:41
@Stephen Tetley:你为什么不把它作为答案?这很棒! – fuz 2011-03-20 09:38:32
在我上面的评论中,我的意思是TDNR - 'Type Directed Name Resolution'不幸在这种情况下Stack Overflow不允许我编辑评论。 @FUZxxl - 谢谢,但我认为这是一个意见,因此它似乎是一个评论,而不是一个答案,它肯定不是普遍的观点。 – 2011-03-20 11:24:49