這個答案只是我在這個問題上的一些隨機想法。我推薦我的另一個答案,因爲爲了這個答案,我花了很多時間去查閱和參考其他人的工作。
記錄語法
以在黑暗中的幾個刺:你的「佈局爲基礎」的提出語法看起來很像非記錄語法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