我对函数式编程完全陌生,我已分配了实现表数据类型的任务。它应该表示为三元组:
("tableName",["key1","key2","key3"],["value1","value2","value3"])
所有项目均为strings
,第一个是表名,后跟two lists
,它们的长度相同。对于第一个列表中的每个键,第二个列表中都有对应的值。键不能重复,值可以重复。
然后我应该实现多种功能,例如:-创建新的空表-插入(名称,键,值)
有人可以帮助我实现这一点吗?我已经尝试了多个教程,但是没有一个教程涵盖这样的内容。
谢谢!
好,您可以从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))
调整toStr
和toHtml
以支持List(List(String))
对读者来说是个好习惯。
缺少您的任务,我不知道您还要为实现添加什么。也许您可以创建一个对列或行进行排序的函数?也许是一个基于查询过滤掉某些行的函数?如果您可以提供更多信息,也许我可以提供更多帮助。