我最好写这样的东西:
myValue1 = 1 :: Int myValue2 = 2 :: Int myFunc :: Int -> Bool myFunc myValue1 = True myFunc myValue2 = False
调用myFunc myValue2
会返回True
- 而不是我的意图。我知道为什么会发生这种情况,但有没有办法在Haskell中表达这一点而不诉诸C风格的#define
语句?
答案 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