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
的全面而完美的演示。如果有什么地方你不明白,请随意指出。