Haskell - 如何从列表中创建数据

时间:2017-02-10 12:52:43

标签: haskell

如果我有某种数据结构:

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

我如何创建一个函数,使得它获取一个字符串列表并创建该对象,其中第一个元素是a,第二个元素是b ...等等,假设列表的大小合适且顺序正确>

createObject :: [String] -> Object

1 个答案:

答案 0 :(得分: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}类型的内容。)

  3. 更新

    第1点有点弱;你可以定义像

    这样的总函数
    createObject (x:y:z:_) = Object x y z
    createObject [x,y] = Object x y ""
    createObject [x] = Object x "" ""
    createObject [] = Object "" "" ""
    

    会忽略额外的输入项目并为缺失的项目指定默认值。