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

时间:2010-09-16 16:31:41

标签: haskell pattern-matching

我最好写这样的东西:

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

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

调用myFunc myValue2会返回True - 而不是我的意图。我知道为什么会发生这种情况,但有没有办法在Haskell中表达这一点而不诉诸C风格的#define语句?

4 个答案:

答案 0 :(得分:23)

好吧,Haskell没有统一这样的名字。那些新的'myValue1'和'2'标识符是你绑定的新变量。

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

data Values
   = D1
   | D2

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

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

答案 1 :(得分:14)

如Don解释的那样,你无法匹配变量值。

但在这种情况下你可以使用警卫:

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

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

答案 2 :(得分:7)

如果您不想创建其他数据类型,通常的解决方案是使用警卫:

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

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

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

答案 3 :(得分:2)

如果想法只是定义一些常用于模式,你也可以使用语言扩展PatternSynonyms

{-# LANGUAGE PatternSynonyms #-}

pattern MyValue1 = 1
pattern MyValue2 = 2

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