如何在Haskell中将函数应用于字符串的嵌套列表?

时间:2019-05-09 20:20:46

标签: haskell

我已经从表中解析了数据(通过tagSoup),现在我已经嵌套了数据列表

datatable with type [[String]]

现在我想将此数据另存为对象列表[Obj]-表格行。每行包含5个字符串。

data Obj = Obj { pdDate :: String,
    pdTournamentId :: String,
    pdTournamentName :: String,
    pdOperation :: String,
    pdTown :: String }
    deriving (Eq,Show,Read)

我有一个创建对象的功能

buildObj [a:b:c:d:e] = do
    let lst = last e
    let line = Obj {pdDate = a,
    pdTournamentId = b,
    pdTournamentName = c,
    pdOperation  = d,
    pdTown  = lst}
    return line 

要遍历主块中的嵌套列表,我调用函数map

    map buildObj datatable
  1. 以及如何将所有数据Obj保存到列表[Obj]?

我在Haskell非常陌生,所以想看看是否有人可以给我一些指导。

谢谢!

更新:@Mark Seemann的回答有助于修复错误类型[[[[String]]]

当前错误

 * Couldn't match expected type `Obj' with actual type `m0 Obj'
    * In a stmt of a 'do' block: return line

 * Couldn't match type `[]' with `IO'
      Expected type: IO Obj
        Actual type: [Obj]
    * In a stmt of a 'do' block: map buildObj datatable

1 个答案:

答案 0 :(得分:4)

模式python manage.py migrate list head { "version": "2.0.0", "tasks": [ { "label": "Migrate", "type": "process", "command": "${config:python.pythonPath}", "args": [ "${workspaceFolder}/src/manage.py", "migrate" ], "presentation": { "echo": true, "reveal": "always", "focus": false, "panel": "shared", "showReuseMessage": true, "clear": true }, "problemMatcher": [] } ] } tail a:b:c:d:e匹配。

模式a同样将匹配具有 head b:c:d:e tail b:c:d:e的列表。

进一步简化,模式b将匹配具有 head c:d:e tail d:e的列表。 / p>

因此,d本身就是一个列表。

如果要在一个列表中精确匹配五个元素,可以将其写为

e

或者,或者

e

请注意,这是不完整的模式匹配。您还应该考虑如果列表小于或大于正好五个元素,该怎么办。