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

Kev*_*vin 18 haskell pattern-matching

我最好写这样的东西:

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

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

致电myFunc myValue2回报True- 不是我想要的.我知道为什么会发生这种情况,但有没有办法在Haskell中表达这一点而不诉诸C风格的#define语句?

Don*_*art 23

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

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

data Values
   = D1
   | D2

myFunc :: Values -> Bool
myFunc D1 = True
myFunc D2 = False
Run Code Online (Sandbox Code Playgroud)

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


sas*_*nin 15

Don解释说,你无法匹配变量值.

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

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

myFunc :: Int -> Bool
myFunc x
  | x == myValue1 = True
  | x == myValue2 = False
Run Code Online (Sandbox Code Playgroud)


Ant*_*sky 7

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

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

myFunc :: Int -> Bool
myFunc val | val == myValue1 = True
           | val == myValue2 = False
Run Code Online (Sandbox Code Playgroud)

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


Hel*_*ira 5

如果这个想法只是定义一些在模式中使用的常量,你也可以使用语言扩展PatternSynonyms:

{-# LANGUAGE PatternSynonyms #-}

pattern MyValue1 = 1
pattern MyValue2 = 2

myFunc :: Int -> Bool
myFunc MyValue1 = True
myFunc MyValue2 = False
Run Code Online (Sandbox Code Playgroud)