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 [] = []