常量我非常喜歡寫這樣的事:哈斯克爾模式匹配 - 如何使用可變
myValue1 = 1 :: Int myValue2 = 2 :: Int myFunc :: Int -> Bool myFunc myValue1 = True myFunc myValue2 = False
調用myFunc myValue2
回報True
- 不是我的打算。我知道爲什麼會發生這種情況,但是有沒有辦法在Haskell中表達這一點,而不訴諸C風格#define
聲明?
常量我非常喜歡寫這樣的事:哈斯克爾模式匹配 - 如何使用可變
myValue1 = 1 :: Int myValue2 = 2 :: Int myFunc :: Int -> Bool myFunc myValue1 = True myFunc myValue2 = False
調用myFunc myValue2
回報True
- 不是我的打算。我知道爲什麼會發生這種情況,但是有沒有辦法在Haskell中表達這一點,而不訴諸C風格#define
聲明?
那麼,Haskell並沒有統一這樣的名字。這些新的'myValue1'和'2'標識符是您綁定的新變量。
最Haskelly的方法是使用強類型和模式匹配:
data Values
= D1
| D2
myFunc :: Values -> Bool
myFunc D1 = True
myFunc D2 = False
給你一個靜態保證只有「1」或「2」可以傳遞給myFunc的,適當的符號匹配,你甚至保留通過派生Enum轉換爲整數。
謝謝,這似乎是最接近我想要做的 - 我沒有想過派生Enum,這將只是票。 – Kevin 2010-09-16 18:20:11
如果您不希望創建另一種數據類型,通常的解決辦法是使用侍衛:
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
,您還可以使用語言擴展PatternSynonyms
:
{-# LANGUAGE PatternSynonyms #-}
pattern MyValue1 = 1
pattern MyValue2 = 2
myFunc :: Int -> Bool
myFunc MyValue1 = True
myFunc MyValue2 = False
謝謝每個人,非常快速的迴應! – Kevin 2010-09-16 18:20:58