如果我有某种数据结构:
data Object = Object { a :: String, b :: String, c :: String }
我如何创建一个函数,使得它获取一个字符串列表并创建该对象,其中第一个元素是a,第二个元素是b ...等等,假设列表的大小合适且顺序正确>
createObject :: [String] -> Object
答案 0 :(得分:5)
您必须明确定义函数,它必然是部分函数。
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 "" "" ""
会忽略额外的输入项目并为缺失的项目指定默认值。