如果我有一些種類的數據結構:哈斯克爾 - 如何從列表中創建數據
data Object = Object { a :: String, b :: String, c :: String }
如何創建這樣的功能,它需要一個字符串列表,並創建對象,其中第一元素是一個,第二個元素爲b ...等假設列表被合適的尺寸,並以正確的順序>
createObject :: [String] -> Object
如果我有一些種類的數據結構:哈斯克爾 - 如何從列表中創建數據
data Object = Object { a :: String, b :: String, c :: String }
如何創建這樣的功能,它需要一個字符串列表,並創建對象,其中第一元素是一個,第二個元素爲b ...等假設列表被合適的尺寸,並以正確的順序>
createObject :: [String] -> Object
你必須明確地定義功能,這是必然的部分功能。
createObject [x,y,z] = Object x y z
Haskell沒有提供任何特殊的語法,因爲它適用的情況相對較少。
輸入列表必須具有由產品類型所需要的元件的確切數目。您可能會爭辯說,函數可能會簡單地忽略較長列表中的元素,但不能返回部分應用的Object
:Object x y
,其類型爲String -> Object
,而不是Object
。
儘管有依賴類型,但是您可以定義createObject
以獲取正確長度的列表,這有點否定了這一點。
產品類型僅限於同類產品。 (無表可用來創建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 "" "" ""
總函數會忽略額外的輸入項目和缺項指定一個默認值。
它不是必要的部分,但這是最明顯的解決方案。他還可以定義「createObject _ = Object」「」「」「」或其他變體。 –
好點。這也影響了我的觀點#1;我會考慮如何最好地修改我的答案。 – chepner
'\ [a,b,c] - > Object a b c'? – leftaroundabout