【问题标题】:"Non-exhaustive patterns" in Haskell functionHaskell 函数中的“非穷举模式”
【发布时间】:2018-10-19 21:44:43
【问题描述】:

在下面的 Haskell 函数中:

allTransformations :: String -> String -> [Transformation]
allTransformations "" "" = []
allTransformations a "" = [map (\a -> Delete a) a]
allTransformations "" b = [map (\b -> Insert b) b]
allTransformations (x:xs) (y:ys)
    | x == y = map (\t -> (Copy x) : t) rest
    | (length xs) < (length ys) = (map (\t -> (Insert y) : t) rest) ++ (map (\t -> (Change x y) : t) rest)
    | (length xs) > (length ys) = (map (\t -> (Delete x) : t) rest) ++ (map (\t -> (Change x y) : t) rest)
    where rest = allTransformations xs ys

在运行 allTransformations "abc" "bca" 时,我收到错误“函数 allTransformations 中的非详尽模式”。问题出在哪里?

我已经介绍了四种情况:两个参数都是空字符串,第二个参数是空的,第一个不是,第一个参数是空的,第二个不是,两个参数都不为空。

这是所有可能的情况,对吧?

【问题讨论】:

  • 拇指规则:如果保护块不以otherwise 结尾,则保护块之前的模式可能无法捕获所有情况,因此在检查穷举时可以忽略它。 (另外,打开警告,这样您就不必只在运行时捕获这些错误)

标签: haskell arguments pattern-matching


【解决方案1】:

您实际上已经涵盖了六个案例,因为您提到的第四个案例有三个不同的守卫:

  • 两者都是空的
  • A 是空的
  • B 为空
  • 两者都不是空的,并且第一个元素是相同的
  • 两者都不是空的,而且 A 更长
  • 两者都不是空的,而且 B 更长

你不见了:

  • 都不为空,第一个元素不等,长度相同

最后一个正是"abc""bca" 的情况

【讨论】:

  • 哦,是的,那太傻了。我不认为四个“外部”案例中的最后一个本身依赖于各种案例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多