我正在学习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/

10-12 17:23