2012-01-23 25 views
3

我知道部分更新的像記錄:任何不錯的記錄在Haskell中處理技巧?

data A a b = A { a :: a, b :: b } 
x = A { a=1,b=2 :: Int } 
y = x { b = toRational (a x) + 4.5 } 

是否有這樣做只是部分初始化,創建一個子記錄類型,或做(反)序列的子記錄什麼花樣?

特別是,我發現,這些第一線的工作,但第二個沒有:

read "A {a=1,b=()}" :: A Int() 
read "A {a=1}" :: A Int() 

你可以使用正則表達式經常按摩這樣的輸入,但我很好奇什麼哈斯克爾樣的選擇存在。

+0

我不太清楚你在這裏要求什麼。一個可以解析'A {a = 1}'的通用反序列化機制?我不建議實際存儲Haskell'Show'格式的任何數據;它不會是緊湊的,並且在Haskell以外的任何地方解析它將是一件痛苦的事情。 – ehird

回答

5

偏初始化正常工作:A {a=1}A Int()類型的有效表達; Read實例只是不打擾解析任何Show實例不輸出。 b字段初始化爲error "...",其中字符串包含幫助調試的文件/行信息。

你一般不應使用Read任何真實世界的解析情況;它適用於具有非常簡單的序列化需求和調試的玩具程序。

我不確定你的意思是「subrecord」,但是如果你想要序列化/反序列化,可以應對「升級」到記錄格式以包含更多信息,同時仍然能夠處理舊的(現在「部分「)序列化,那麼safecopy庫就是這樣做的。

+0

啊,我只是沒有超過你發出警告時發生的警告,以及顯示異常的異常。是的safecopy看起來很有趣,謝謝! –

0

你不能走在Haskell一些價值「初始化」(這將是不可能的「初始化」後來無論如何,因爲Haskell是純)。如果要爲字段提供「默認」值,則可以爲記錄類型設置一些「默認」值,然後對該默認值進行部分更新,只設置您關心的字段。不過,我不知道如何以簡單的方式實現read