【问题标题】:Non-exhaustive Error in Basic Haskell Function基本 Haskell 函数中的非穷举错误
【发布时间】:2011-06-22 21:43:30
【问题描述】:

我是 Haskell 的新手,我试图组合一个简单的函数来检查两个数字是否相等。这可以编译,但是当我尝试对该程序进行测试时,它说这不是详尽的。我不明白布尔函数如何不详尽?提前致谢:

data Value = ConstInt Int
           | Numequal Value Value
           | Ctrue Bool
           | Cfalse Bool
            deriving (Read, Show)
eval:: Value -> Bool

eval (Numequal e1 e2) =
   let x = eval e1
       y = eval e2
         in case (x, y) of
            (i1, i2)  -> 
                if x == y
                then False
                else True

【问题讨论】:

    标签: haskell boolean non-exhaustive-patterns


    【解决方案1】:

    你还没有完成你的eval 函数。例如,假设我打电话给eval (ConstInt 34)。它应该返回什么?

    另外,想想你的函数体中有什么。 eval 返回一个布尔值,所以xy 都将是布尔值,您正在测试它们是否相等。那是你要的吗?

    【讨论】:

    • 好吧,既然你没有包含很多 cmets,我很难理解你真正想要什么。这就是我要问的原因 - 用你自己的话说出你想要 eval 真正做的事情,与它的实现分开。
    • 哦,好的。我只想 eval 取两个整数,看看它们是否相等。如果是的话,那就是真的。如果不是,那就是假的。看起来很简单,但我不明白这里的 x 和 y 是布尔值吗?
    • 好的,退一步。如果那是您真正想要的,eval 将如下所示:eval x y = x == y,您将不需要 Value 数据类型。但是,我再次感觉到这不是您真正想要的。
    • 在您描述的评估中,您将如何根据对 2 个数字的测试返回真值或假值?为了更好地学习 Haskell,我一直在努力开发一个整数计算器,并希望在其中也包含这个函数,以便将不同类型的函数组合在一起。例如,如果我使用 t1 = Numequal (ConstInt 1)(ConstInt 1) 的测试,然后 t2 = eval t1?
    • 好的,我想我可能已经弄清楚我哪里出错了。 (相当多的地方!)我取出了 x 和 y 上的 eval,以便它只为我提供#s,并替换了 Value 数据类型。哦……我切换了真/假,这样它们才有意义!:)
    【解决方案2】:

    使用模式匹配时,您必须处理所有种可能的情况。

    eval (Numequal e1 e2) = ...
    eval _ = False -- or patterns for ConstInt, Ctrue and Cfalse
    

    【讨论】:

    • 哦,当然!谢谢...在考虑可以输入的内容时,出于某种原因,我只想到真/假。
    • 嗯,在 Haskell 中实际上并非如此。只是如果你不这样做,如果你不小心,可能会导致运行时错误。
    【解决方案3】:

    据我所知,您的数据类型应该是 deriving (Eq),以便您能够对其进行比较。

    【讨论】:

    • 我试过了,但在我的测试用例中仍然出现非详尽的模式错误。
    • 模式匹配可用于任何数据类型,而不仅仅是Eq的实例。
    • @pelotom 我实际上指的是比较x == y,而不是严格意义上的模式匹配。应该指出它是'''旁注'''
    • 啊,我没注意到x == y
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多