2017-02-10 24 views
0

如果我有一些種類的數據結構:哈斯克爾 - 如何從列表中創建數據

data Object = Object { a :: String, b :: String, c :: String } 

如何創建這樣的功能,它需要一個字符串列表,並創建對象,其中第一元素是一個,第二個元素爲b ...等假設列表被合適的尺寸,並以正確的順序>

createObject :: [String] -> Object 
+3

'\ [a,b,c] - > Object a b c'? – leftaroundabout

回答

5

你必須明確地定義功能,這是必然的部分功能。

createObject [x,y,z] = Object x y z 

Haskell沒有提供任何特殊的語法,因爲它適用的情況相對較少。

  1. 輸入列表必須具有由產品類型所需要的元件的確切數目。您可能會爭辯說,函數可能會簡單地忽略較長列表中的元素,但不能返回部分應用的ObjectObject x y,其類型爲String -> Object,而不是Object

    儘管有依賴類型,但是您可以定義createObject以獲取正確長度的列表,這有點否定了這一點。

  2. 產品類型僅限於同類產品。 (無表可用來創建data Foo = Foo {a ::Int, b::String}類型的東西,例如。)


更新:

點1是有點弱;你可以這樣定義

createObject (x:y:z:_) = Object x y z 
createObject [x,y] = Object x y "" 
createObject [x] = Object x "" "" 
createObject [] = Object "" "" "" 

總函數會忽略額外的輸入項目和缺項指定一個默認值。

+1

它不是必要的部分,但這是最明顯的解決方案。他還可以定義「createObject _ = Object」「」「」「」或其他變體。 –

+0

好點。這也影響了我的觀點#1;我會考慮如何最好地修改我的答案。 – chepner