【问题标题】:These patterns look exhaustive to me, "Non-exhaustive patterns error" ? Why?这些模式对我来说看起来很详尽,“非详尽模式错误”?为什么?
【发布时间】:2016-08-21 21:53:49
【问题描述】:

问题

在从 Haskell 书中记笔记时,此代码示例应返回:Left [NameEmpty, AgeTooLow],但它仅返回第一种情况 Left [NameEmpty]。然后,当我将函数 mkPerson2 结果传递给它应该返回 Right Person _ _ 时,我得到一个“非详尽模式”错误。我已经查看了这段代码很长一段时间,但它看起来对我来说是正确的。我在这里想念什么?任何关于该主题的解释将不胜感激,谢谢!

Book I'm using

代码

module EqCaseGuard where

type Name = String
type Age  = Integer
type ValidatePerson a = Either [PersonInvalid] a

data Person = Person Name Age deriving Show

data PersonInvalid = NameEmpty
                   | AgeTooLow
                   deriving Eq

ageOkay :: Age -> Either [PersonInvalid] Age
ageOkay age = case age >= 0 of
True  -> Right age
False -> Left [AgeTooLow]

nameOkay :: Name -> Either [PersonInvalid] Name
nameOkay name = case name /= "" of
True  -> Right name
False -> Left [NameEmpty]

mkPerson2 :: Name -> Age -> ValidatePerson Person
mkPerson2 name age = mkPerson2' (nameOkay name) (ageOkay age)

mkPerson2' :: ValidatePerson Name -> ValidatePerson Age -> ValidatePerson Person
mKPerson2' (Right nameOk) (Right ageOk) = Right (Person nameOk ageOk)
mKPerson2' (Left badName) (Left badAge) = Left (badName ++ badAge)
mkPerson2' (Left badName)  _            = Left badName
mkPerson2' _              (Left badAge) = Left badAge

错误

*EqCaseGuard> mkPerson2 "jack" 22
*** Exception: eqCaseGuard.hs:(54,1)-(55,53): Non-exhaustive patterns in function mkPerson2'

*EqCaseGuard> mkPerson2 "" (-1)
Left [NameEmpty]
*EqCaseGuard> 

【问题讨论】:

  • 如果您使用-Wall,那么GHC 将通过两种方式帮助您。它会告诉你它看到了哪些非详尽的模式,它会告诉你意外函数mKPerson2' 缺少它的类型签名。

标签: haskell functional-programming pattern-matching


【解决方案1】:

您在前两个定义中使用了大写字母 K:

mKPerson2' (Right nameOk) (Right ageOk) = Right (Person nameOk ageOk)
 ^

mKPerson2' (Left badName) (Left badAge) = Left (badName ++ badAge)
 ^

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多