Haskell模式匹配-如何使用常量变量
理想情况下,我想写以下内容: 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=FalseHaskell模式匹配-如何使用常量变量,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——这不是我想要的
调用
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,这将只是一张票。谢谢大家,非常快速的响应!