Elm实现customTable数据类型

问题描述 投票:0回答:1

我对函数式编程完全陌生,我已分配了实现表数据类型的任务。它应该表示为三元组:

("tableName",["key1","key2","key3"],["value1","value2","value3"])

所有项目均为strings,第一个是表名,后跟two lists,它们的长度相同。对于第一个列表中的每个键,第二个列表中都有对应的值。键不能重复,值可以重复。

然后我应该实现多种功能,例如:-创建新的空表-插入(名称,键,值)

有人可以帮助我实现这一点吗?我已经尝试了多个教程,但是没有一个教程涵盖这样的内容。

谢谢!

functional-programming elm
1个回答
2
投票

好,您可以从type定义开始-

type Table =
  Table (String, List(String), List(String))

现在我们可以创建myTable-

myTable =
  Table ("foo", ["a", "b"], ["c", "d"])

要“实现”数据类型,意味着您将编写对数据类型起作用的函数。考虑这个极其原始的toStr函数-

toStr (Table (title, cols, rows)) =
  title
    ++ "|"
    ++ String.concat(cols) 
    ++ "|"
    ++ String.concat(rows)

toStr myTable
# foo|ab|cd

也许您想要toHtml-

toHtml (Table (title, cols, rows)) =
  let
    header =
      cols
        |> List.map(text >> List.singleton >> (th []))
        |> (tr [])

    body =
      rows
        |> List.map(text >> List.singleton >> (td []))
        |> (tr [])

  in
    table []
      [ thead [] [ header ]
      , tbody [] [ body ]
      ]

哪个生产-

<table>
  <thead>
    <tr>
      <th>a</th>
      <th>b</th>
    </tr>
  </thead>
  <body>
    <tr>
      <td>c</td>
      <td>d</td>
    </tr>
  </tbody>
</table>

希望这显示了当前Table类型要求的重要限制:它仅支持一个标题行和一个数据行。考虑这种替代类型-

type Table
  Table (String, List(String), List(List(String)))

如果每个数据行都是List(String),如果我们想要更多的行列表,我们可以接受List(List(String))。或...

type alias Datum =
  String

type alias Row =
  List(Datum)

type Table =
  Table (String, List(Datum), List(Row))

调整toStrtoHtml以支持List(List(String))对读者来说是个好习惯。

缺少您的任务,我不知道您还要为实现添加什么。也许您可以创建一个对列或行进行排序的函数?也许是一个基于查询过滤掉某些行的函数?如果您可以提供更多信息,也许我可以提供更多帮助。

© www.soinside.com 2019 - 2024. All rights reserved.