Functional programming 实现customTable数据类型的Elm
我对函数式编程是完全陌生的,我的任务是实现表数据类型。它应该表示为三元组:Functional programming 实现customTable数据类型的Elm,functional-programming,elm,Functional Programming,Elm,我对函数式编程是完全陌生的,我的任务是实现表数据类型。它应该表示为三元组: ("tableName",["key1","key2","key3"],["value1","value2","value3"]) 所有项目都是字符串,第一个是表名,后面是两个长度相同的列表。对于第一个列表中的每个键,第二个列表中都有相应的值。键不能重复,值可以重复 然后我应该实现多个功能,例如: -创建新的空表 -插入(名称、键、值) 有谁能帮我实现这一点吗?我尝试过多个教程,但没有一个包含类似的内容 谢谢 你可以从
("tableName",["key1","key2","key3"],["value1","value2","value3"])
所有项目都是字符串
,第一个是表名,后面是两个长度相同的列表。对于第一个列表中的每个键,第二个列表中都有相应的值。键不能重复,值可以重复
然后我应该实现多个功能,例如:
-创建新的空表
-插入(名称、键、值)
有谁能帮我实现这一点吗?我尝试过多个教程,但没有一个包含类似的内容
谢谢 你可以从
类型开始-
type Table =
Table (String, List(String), List(String))
现在我们可以创建myTable
-
myTable =
Table ("foo", ["a", "b"], ["c", "d"])
“实现”数据类型意味着您将编写作用于该数据类型的函数。请考虑这个非常原始的代码<代码> toSTR < /代码>函数-< /p>
toStr (Table (title, cols, rows)) =
title
++ "|"
++ String.concat(cols)
++ "|"
++ String.concat(rows)
也许您想要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>
如果每个数据行都是一个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))
对于读者来说是一个很好的练习
除了你的任务,我不知道还有什么可以添加到你的实现中。也许您可以创建一个对列或行进行排序的函数?也许是一个基于查询过滤掉一些行的函数?如果您能提供更多信息,也许我可以提供更多帮助。好的,您可以从类型开始定义-
type Table =
Table (String, List(String), List(String))
现在我们可以创建myTable
-
myTable =
Table ("foo", ["a", "b"], ["c", "d"])
“实现”数据类型意味着您将编写作用于该数据类型的函数。请考虑这个非常原始的代码<代码> toSTR < /代码>函数-< /p>
toStr (Table (title, cols, rows)) =
title
++ "|"
++ String.concat(cols)
++ "|"
++ String.concat(rows)
也许您想要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>
如果每个数据行都是一个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))
对于读者来说是一个很好的练习
除了你的任务,我不知道还有什么可以添加到你的实现中。也许您可以创建一个对列或行进行排序的函数?也许是一个基于查询过滤掉一些行的函数?如果您能提供更多信息,或许我可以提供更多帮助。您需要将其作为一个三元组来实现,这是一个严格的要求吗?依我看,这不是设计这种数据结构的最佳方式。如果你正在学习某些课程或其他教学材料,那么这是有意义的。为了更好地回答你的问题,最好与大家分享你到目前为止的情况,并说明你所面临的问题。如果你完全迷路了(我也理解),那么这里有一些提示。1) 因为在Elm中不能直接存储状态,所以需要在每个函数调用中传递结构(即状态)。2)从创建初始化状态的新表开始。@kaskelotti感谢您的回答和提示。是的,如问题所示,将其作为一个三元组执行是一项严格的要求。我完全迷路了,对埃尔姆完全陌生。我刚刚尝试过编写一些小的递归函数和处理列表,但没有这样的。我在网上找不到任何有用的信息。你需要把它作为一个三元组来实现吗?依我看,这不是设计这种数据结构的最佳方式。如果你正在学习某些课程或其他教学材料,那么这是有意义的。为了更好地回答你的问题,最好与大家分享你到目前为止的情况,并说明你所面临的问题。如果你完全迷路了(我也理解),那么这里有一些提示。1) 因为在Elm中不能直接存储状态,所以需要在每个函数调用中传递结构(即状态)。2)从创建初始化状态的新表开始。@kaskelotti感谢您的回答和提示。是的,如问题所示,将其作为一个三元组执行是一项严格的要求。我完全迷路了,对埃尔姆完全陌生。我刚刚尝试过编写一些小的递归函数和处理列表,但没有这样的。我无法在网上找到任何有用的信息。