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感谢您的回答和提示。是的,如问题所示,将其作为一个三元组执行是一项严格的要求。我完全迷路了,对埃尔姆完全陌生。我刚刚尝试过编写一些小的递归函数和处理列表,但没有这样的。我无法在网上找到任何有用的信息。