我正在学习Haskell,并且想编写一个简单的程序,该程序只将一个字符串中的每个字母重复两次。
我想出了这个:
repl :: String -> String
repl " " = " "
repl (x:xs) = x:x:repl xs
编译时,我没有收到任何警告,但是当我执行
repl "abcd"
时发生了运行时错误:“abcd ***异常:repl.hs:(2,1)-(3,23):函数repl中的非穷尽模式
为什么编译器从不报告此问题,为什么当有许多语言(如OCaml)在编译时明确报告此问题时,为什么在Haskell中将其忽略?
最佳答案
模式匹配警告默认情况下处于关闭状态。您可以使用-fwarn-incomplete-patterns
启用它,也可以使用-W
和-Wall
将其作为更大的警告包的一部分。
您可以从ghci
做到这一点:
Prelude> :set -W
您还可以在编译时将标志传递给
ghc
或将其作为杂注包含在模块顶部:{-# OPTIONS_GHC -fwarn-incomplete-patterns #-}
对于您的特定程序,它应发出以下警告:
/home/tjelvis/Documents/so/incomplete-patterns.hs:2:1: Warning:
Pattern match(es) are non-exhaustive
In an equation for ‘repl’: Patterns not matched: []
关于haskell - Haskell中的非穷尽模式匹配,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31866379/