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)
如果您不想创建其他数据类型,通常的解决方案是使用警卫:
myValue1 = 1 :: Int
myValue2 = 2 :: Int
myFunc :: Int -> Bool
myFunc val | val == myValue1 = True
| val == myValue2 = False
Run Code Online (Sandbox Code Playgroud)
您在管道之后放置的内容可以是任何布尔条件; 如果是,则运行相应的函数体.
如果这个想法只是定义一些在模式中使用的常量,你也可以使用语言扩展PatternSynonyms:
{-# LANGUAGE PatternSynonyms #-}
pattern MyValue1 = 1
pattern MyValue2 = 2
myFunc :: Int -> Bool
myFunc MyValue1 = True
myFunc MyValue2 = False
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4028 次 |
| 最近记录: |