SML中的匹配警告和模式匹配
我想知道如果SML中的匹配警告和模式匹配,sml,Sml,我想知道如果SML中的模式匹配将继续执行Match警告,有什么好的策略可以理解 考虑以下功能: fun f 7 (x,y) = x * 5.1 | f x (y,#"a") = y; 乍一看,它似乎没有提供Match警告。但如果我来运行它,它会的 在我看来,我们处理所有的案件。哪种情况我们不处理?即使f7(x,#“a”)我们也知道应该是哪种情况(第一种情况) 我的问题是,如何确定函数将输出衰减 此外,我很乐意回答为什么以下函数无效: fun f (x::xs) (y::ys) (z::zs)
SML
中的模式匹配将继续执行Match
警告,有什么好的策略可以理解
考虑以下功能:
fun f 7 (x,y) = x * 5.1 | f x (y,#"a") = y;
乍一看,它似乎没有提供Match
警告。但如果我来运行它,它会的
在我看来,我们处理所有的案件。哪种情况我们不处理?即使f7(x,#“a”)
我们也知道应该是哪种情况(第一种情况)
我的问题是,如何确定函数将输出衰减
此外,我很乐意回答为什么以下函数无效:
fun f (x::xs) (y::ys) (z::zs) = y::xs::ys::zs;
没有zs
它是有效的。zs
如何改变它
我的问题是,如何确定函数将输出衰减
编译器有一个决定这一点的算法
要么使用编译器并让它警告您,要么在您的头脑中使用类似的启发式方法
见吕克·马兰杰(2007年)
它涵盖了寻找缺失和重复模式的问题、算法和实现
一个有用的启发式方法:排列模式,例如:
fun fact 0 = 1
| fact n = n * fact (n - 1)
问问自己:是否有任何值的组合不是由函数的一种情况来处理的?每个函数用例都应该处理输入的特定逻辑类别。由于您的示例不是实际示例,因此无法使用此方法,因为输入上没有逻辑类别
而fact
有点简单,因为很容易决定它是属于0
还是n
然而,值~1
是否正确地放在这些类别中
下面是一个有问题模式的函数的示例:
fun hammingDistance [] [] = SOME 0
| hammingDistance (x::xs) (y::ys) =
if length xs <> length ys then NONE else
if x = y
then hammingDistance xs ys
else Option.map (fn d => d + 1) (hammingDistance xs ys)
这里只有三种模式/身体,但最后一种是包罗万象xs
和ys
匹配所有可能的列表,无论是空列表还是非空列表,除非它们首先与前面的模式之一匹配。因此,第三种情况说明了这两种情况<代码>[],:
和3<代码>:,[]
因此,我不能简单地一次计算每个图案/身体。如果通过模式变量包含非常通用的模式,则有些可能会解释一个以上的输入类。如果通过多个构造函数包含过度特定的模式,则其中一些可能会占用较少的总输入空间。例如
fun pairs (x::y::rest) = (x, y) :: pairs rest
| pairs [] = []
这里的x::y::rest
非常具体,因此我没有完全讨论一个元素的情况
那么
f8(x,#“b”)
呢?@hnefat哦,对了,我没想过。
fun pairs (x::y::rest) = (x, y) :: pairs rest
| pairs [] = []