2010-09-16 45 views
15

常量我非常喜歡寫這樣的事:哈斯克爾模式匹配 - 如何使用可變

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

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

調用myFunc myValue2回報True - 不是我的打算。我知道爲什麼會發生這種情況,但是有沒有辦法在Haskell中表達這一點,而不訴諸C風格#define聲明?

+0

謝謝每個人,非常快速的迴應! – Kevin 2010-09-16 18:20:58

回答

22

那麼,Haskell並沒有統一這樣的名字。這些新的'myValue1'和'2'標識符是您綁定的新變量。

最Haskelly的方法是使用強類型和模式匹配:

data Values 
    = D1 
    | D2 

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

給你一個靜態保證只有「1」或「2」可以傳遞給myFunc的,適當的符號匹配,你甚至保留通過派生Enum轉換爲整數。

+0

謝謝,這似乎是最接近我想要做的 - 我沒有想過派生Enum,這將只是票。 – Kevin 2010-09-16 18:20:11

6

如果您不希望創建另一種數據類型,通常的解決辦法是使用侍衛:

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

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

你管後放什麼可以是任何布爾條件;如果這是真的,則會運行相應的函數體。

12

正如Don解釋的那樣,您無法與變量值匹配。

但是你可以在這種情況下使用防護:如果這個想法僅僅是定義一些常量時使用的模式

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

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

,您還可以使用語言擴展PatternSynonyms

{-# LANGUAGE PatternSynonyms #-} 

pattern MyValue1 = 1 
pattern MyValue2 = 2 

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