在 sml/nj 中,我想创建一个函数,它接受一个非空列表的列表,并返回每个非空列表的第一个元素的列表。
fun get_first [] = []
| get_first x::xs = (hd x)::get_first xs;
get_first: ('a list) list -> 'a list;
但是,这不起作用...有谁知道出了什么问题?
在 sml/nj 中,我想创建一个函数,它接受一个非空列表的列表,并返回每个非空列表的第一个元素的列表。
fun get_first [] = []
| get_first x::xs = (hd x)::get_first xs;
get_first: ('a list) list -> 'a list;
但是,这不起作用...有谁知道出了什么问题?
您忘记在列表模式周围加上括号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