Haskell模式匹配-如何使用常量变量

Haskell模式匹配-如何使用常量变量,haskell,pattern-matching,Haskell,Pattern Matching,理想情况下,我想写以下内容: myValue1 = 1 :: Int myValue2 = 2 :: Int myFunc :: Int -> Bool myFunc myValue1 = True myFunc myValue2 = False myValue1=1::Int myValue2=2::Int myFunc::Int->Bool myFunc myValue1=True myFunc myValue2=False 调用myFunc myValue2返回True——这不是我想要的

理想情况下,我想写以下内容:

myValue1 = 1 :: Int myValue2 = 2 :: Int myFunc :: Int -> Bool myFunc myValue1 = True myFunc myValue2 = False myValue1=1::Int myValue2=2::Int myFunc::Int->Bool myFunc myValue1=True myFunc myValue2=False
调用
myFunc myValue2
返回
True
——这不是我想要的。我知道为什么会发生这种情况,但是有没有一种方法可以在Haskell中表达这种情况,而不必使用C风格的
#define
语句?

嗯,Haskell并没有像这样统一名称。这些新的“myValue1”和“2”标识符是您正在绑定的新变量

最简单的方法是使用强类型和模式匹配:

data Values
   = D1
   | D2

myFunc :: Values -> Bool
myFunc D1 = True
myFunc D2 = False

给您一个静态保证,只有“1”或“2”可以传递给myFunc,正确的符号匹配,您甚至可以通过导出Enum保留到整数的转换。

如果您不想创建另一个数据类型,通常的解决方案是使用保护:

myValue1 = 1 :: Int
myValue2 = 2 :: Int

myFunc :: Int -> Bool
myFunc val | val == myValue1 = True
           | val == myValue2 = False

在管道后面放置的内容可以是任何布尔条件;如果为真,则将运行相应的函数体。

您无法按照Don的解释匹配变量值

但在这种情况下,您可以使用防护装置:

myValue1 = 1 :: Int
myValue2 = 2 :: Int

myFunc :: Int -> Bool
myFunc x
  | x == myValue1 = True
  | x == myValue2 = False

如果只是定义一些常量以在模式中使用,还可以使用语言扩展名
patternsynoms

{-# LANGUAGE PatternSynonyms #-}

pattern MyValue1 = 1
pattern MyValue2 = 2

myFunc :: Int -> Bool
myFunc MyValue1 = True
myFunc MyValue2 = False

谢谢,这似乎是最接近我想要做的事情了-我没有想到要导出Enum,这将只是一张票。谢谢大家,非常快速的响应!