0

在 sml/nj 中,我想创建一个函数,它接受一个非空列表的列表,并返回每个非空列表的第一个元素的列表。

fun get_first [] = []
 | get_first x::xs = (hd x)::get_first xs;
get_first: ('a list) list -> 'a list;

但是,这不起作用...有谁知道出了什么问题?

4

1 回答 1

1

您忘记在列表模式周围加上括号x::xs,如下所示:

fun get_first [] = []
  | get_first (x::xs) = (hd x)::get_first xs

它不起作用的原因有点“复杂”。在 SML 中,列表只是被定义为一种数据类型和一些语法糖。它基本上看起来像这样

datatype 'a list = nil | :: of ('a * 'a list)

由于可以对数据类型构造函数进行模式匹配,因此可以对nil(通常写为 [])和::.
但是,如果您不在它周围放置括号,那么它将被解释为该函数是模式匹配 3 个咖喱参数。这可能像这样更好地可视化

  | get_first (x) (::) (xs) = ....

另请注意,您可以使用 map 函数轻松实现这一点

fun get_first xs = map hd xs
于 2013-02-19T09:26:46.857 回答