Sml ML:匹配非穷举

Sml ML:匹配非穷举,sml,ml,non-exhaustive-patterns,Sml,Ml,Non Exhaustive Patterns,我想使名为headcol的函数类似于: headcol[[1,2],[3,4]] = [1,3]; 所以我做了如下函数: fun headcol [] = [] | headcol [x::xs',y::ys'] = [x,y] 但是当我调用它时,会得到一个非穷举的匹配。IIUC,headcol将提取参数中的所有列表头,其类型为'a-list-list。你所计算的只是[]和[x::xs',y::ys'],而不是其他任何东西。因此,如果您的参数有两个子列表以上,execption将引发

我想使名为
headcol
的函数类似于:

headcol[[1,2],[3,4]] = [1,3]; 
所以我做了如下函数:

fun headcol [] = [] 
  | headcol [x::xs',y::ys'] = [x,y]

但是当我调用它时,会得到一个非穷举的匹配。

IIUC,
headcol
将提取参数中的所有列表头,其类型为
'a-list-list
。你所计算的只是
[]
[x::xs',y::ys']
,而不是其他任何东西。因此,如果您的参数有两个子列表以上,execption将引发:

- headcol[[1,2],[3,4], [4, 5, 9]]; 

uncaught exception Match [nonexhaustive match failure]
  raised at: a.sml:9.34
- 
若你们只想处理两个元素列表,结对是一个更好的选择。否则,应匹配更多情况:

fun headcol list =
    case list of
        [] => []
      | x::xs' =>
        case x of
            [] => headcol xs'
         |  h::t => h::(headcol xs')
输出:

- headcol[[1,2],[3,4], [4, 5, 9]]; 
- val it = [1,3,4] : int list

IIUC,
headcol
将提取参数中的所有列表标题,其类型为
'a-list-list
。你所计算的只是
[]
[x::xs',y::ys']
,而不是其他任何东西。因此,如果您的参数有两个子列表以上,execption将引发:

- headcol[[1,2],[3,4], [4, 5, 9]]; 

uncaught exception Match [nonexhaustive match failure]
  raised at: a.sml:9.34
- 
若你们只想处理两个元素列表,结对是一个更好的选择。否则,应匹配更多情况:

fun headcol list =
    case list of
        [] => []
      | x::xs' =>
        case x of
            [] => headcol xs'
         |  h::t => h::(headcol xs')
输出:

- headcol[[1,2],[3,4], [4, 5, 9]]; 
- val it = [1,3,4] : int list

作为陳 力 指出,很难回答仅由函数名称及其尝试的解决方案定义的问题。尽管如此,
head
听起来像是要获取每个子列表的第一个元素,
col
听起来像是将此列表视为一个矩阵,其中列与子列表正交

递归解决方案也可能类似于:

fun headcol [] = []
  | headcol ((x::_)::xss) = x :: headcol xss
  | headcol ([]::xss) = headcol xss
以下是如何使用内置的高阶列表组合器进行操作:

fun headcol xss =
    List.concat (List.map (fn xs => List.take (xs, 1)) xss)
我不只是做以下事情的原因:

fun headcol xss =
    List.map hd xss
因为
hd
是一个部分函数,所以
hd[]
将在运行时崩溃

另一方面,
List.take([],1)
将返回
[]

List.concat
将临时结果
[[1]、[2]、[3]]
合并到
[1,2,3]

或者,如果缺少一列,
[[1],[3]]
插入
[1,3]

测试用例:

val test_headcol_0 = headcol [] = []
val test_headcol_1 = headcol [[1]] = [1]
val test_headcol_2 = headcol [[1,2],[3,4]] = [1,3]
val test_headcol_3 = headcol [[1,2,3],[4,5,6],[7,8,9]] = [1,4,7]
val test_headcol_4 = headcol [[1],[2,3],[4,5,6]] = [1,2,4]
val test_headcol_5 = headcol [[1],[],[2,3]] = [1,2]
当然,我不知道对于没有head列的不规则矩阵,
headcol
是否就是你所期望的行为。这是一个你不会去调查的角落案件。在函数式编程中,通常将错误处理嵌入到返回值中,而不是抛出异常

例如,您可能希望从
headcol
返回一个
”列表选项,其中
一些[1,4,7]
表示每行都有一个head列,
NONE
表示至少有一行无法生成列


或者,您可以使用列表以外的数据类型来表示矩阵,该矩阵不允许缺少列的行,例如,.

作为陳 力 指出,很难回答仅由函数名称及其尝试的解决方案定义的问题。尽管如此,
head
听起来像是要获取每个子列表的第一个元素,
col
听起来像是将此列表视为一个矩阵,其中列与子列表正交

递归解决方案也可能类似于:

fun headcol [] = []
  | headcol ((x::_)::xss) = x :: headcol xss
  | headcol ([]::xss) = headcol xss
以下是如何使用内置的高阶列表组合器进行操作:

fun headcol xss =
    List.concat (List.map (fn xs => List.take (xs, 1)) xss)
我不只是做以下事情的原因:

fun headcol xss =
    List.map hd xss
因为
hd
是一个部分函数,所以
hd[]
将在运行时崩溃

另一方面,
List.take([],1)
将返回
[]

List.concat
将临时结果
[[1]、[2]、[3]]
合并到
[1,2,3]

或者,如果缺少一列,
[[1],[3]]
插入
[1,3]

测试用例:

val test_headcol_0 = headcol [] = []
val test_headcol_1 = headcol [[1]] = [1]
val test_headcol_2 = headcol [[1,2],[3,4]] = [1,3]
val test_headcol_3 = headcol [[1,2,3],[4,5,6],[7,8,9]] = [1,4,7]
val test_headcol_4 = headcol [[1],[2,3],[4,5,6]] = [1,2,4]
val test_headcol_5 = headcol [[1],[],[2,3]] = [1,2]
当然,我不知道对于没有head列的不规则矩阵,
headcol
是否就是你所期望的行为。这是一个你不会去调查的角落案件。在函数式编程中,通常将错误处理嵌入到返回值中,而不是抛出异常

例如,您可能希望从
headcol
返回一个
”列表选项,其中
一些[1,4,7]
表示每行都有一个head列,
NONE
表示至少有一行无法生成列


或者,您可以使用除列表以外的数据类型来表示矩阵,该矩阵不允许行中缺少列,例如。

我想创建名为“headcol”的函数,您应该澄清您真正想要的是什么。您的参数是一个列表(可以有无限个元素),但您只能计算2元素列表。这就是
nonexhoustive
的意思。我想把函数命名为'headcol',你应该弄清楚你到底想要什么。您的参数是一个列表(可以有无限个元素),但您只能计算2元素列表。这就是
nonexhaustive
的意思。您能用“map”重写函数吗@이시온 Simon提供了一个关于
map
的全面而完美的演示。如果有什么地方你不明白,请随意指出。你能用“map”重写函数吗@이시온 Simon提供了一个关于
map
的全面而完美的演示。如果有什么地方你不明白,请随意指出。