2014-05-20 84 views
5

只要盯着Haskell。我想定義一些元素來輕鬆創建它們之間的態射。模式匹配變量的值

a = "foo" 
b = "bar" 

g a = a --Problem is here 
g b = a --Problem is here 

編輯的問題是,Haskell的治療的「a」「克」作爲變量,但我真正想要的「a」如上定義的值。從概念上講,希望這個

g (valueOf a) = a --Problem is here 
g (valueOf b) = a --Problem is here 

valueOf是一個神奇的功能,這將使我

g "foo" = a 
g "bar" = a 
+0

g是無標識,因爲:g b = a –

回答

7

使用

a = "foo" 
b = "bar" 

g x | x==a = a 
    | x==b = a 

g "foo" = a 
g "bar" = a 

當使用變量作爲

g a = ... 

可變a你模式匹配是一個局部變量,綁定到函數的自變量。即使全球已定義a,上面的代碼也不會使用全局a的值執行比較。

這種語義允許本地推理你的代碼。只要看一眼上面的定義可以看出,f 2 34

f 2 x = 4 
f c d = 0 

:考慮下面的代碼作爲例子。

x = 5 

f 2 x = 4 
f c d = 0 

如果匹配語義相比,第二個參數5,現在我們將不得不f 2 3等於0:如果以後你添加一個定義x如下這一點沒有改變。這將使得關於函數定義的推理更加困難,所以大多數(如果不是全部的話)函數式語言(如Haskell)使用「局部」變量進行模式匹配,忽略了這些變量的可能全局定義。


一個更冒險的選擇是使用view patterns

{-# LANGUAGE ViewPatterns #-} 
a = "foo" 
b = "bar" 
g ((==a) -> True) = ... 
g ((==b) -> True) = ... 

我不是這種方法的粉絲雖然,因爲我覺得標準模式與警衛更清晰。

+0

謝謝!我明白了這一點。但仍然認爲應該有一個操作員告訴解釋器使用外部範圍中的定義。 –

+0

衛士如'x | x == a = ... | x == b = ...'不需要太多打字。否則,你可能想試驗[查看模式](http://www.haskell.org/ghc/docs/latest/html/users_guide/syntax-extns.html#view-patterns),但它們似乎矯枉過正任務恕我直言。 – chi

3

如果這是一個完整的誤解,你想完成什麼 ,但不會像這樣?

Data Obj = A | B 

g A = A 
g B = A 

f A = "foo" 
f B = "bar" 

你想要一組預定義的對象嗎?