2015-12-23 27 views
0

我注意到試圖在haskell中使用參數執行模式匹配並不總是奏效。下面是一個例子:與haskell中的整數匹配的模式給出錯誤的結果

test :: Integer -> Integer -> String 
test num1 num2 = case num1 of 
        num2 -> "foo" 
        otherwise -> "bar" 

當我在解釋器中加載它時,它會警告我重疊的模式匹配。此外,test a b對於任何兩個整數ab均返回"foo",無論它們是否相等。看起來模式匹配中的num2與參數中的不一樣。

我想知道爲什麼會發生這種情況。我真的很感謝任何有關情況的見解。

+0

你幾乎說,正是它的原因:「在'num2'的模式匹配是不一樣的人在論據」。 –

回答

2

num2是一種匹配任何值的模式。總是。它與範圍內的現有變量num2無關。 (在這種情況下的替代,這裏"foo"的右側,相匹配的值將被綁定到名字num2,陰影現有名稱num2。但是,這不是與此有關,因爲你不使用num2反正。)

想象一下,如果你所有的map f (x : xs) = f x : map f xs模式匹配的變化意義只是因爲有人定義了一個名爲x的頂級變量!

類似地,otherwise是一種匹配所有內容的模式,並且與頂級值otherwise無關。 otherwise應該用於像| otherwise = ...這樣的警衛;其定義是otherwise = True

在這種情況下,要解決你的程序的最簡單的方法就是

test num1 num2 = if num1 == num2 then "foo" else "bar" 
+0

你是什麼意思「與頂級價值無關'否則'」? '否則'*是* Prelude中定義的頂級值。你可以隱藏它:'import Prelude hiding(otherwise)'。或者我誤解了你? – user3237465

+0

@ user3237465在一個模式匹配中,'otherwise'不是指'真'的值。它怎麼可能?您無法使用「True」匹配num2,一個數字。相反,它的作用類似於定義爲「True」的'otherwise',因爲它匹配任何東西:因爲它是永遠不會匹配的模式。除了'否則',你可以平等地寫'_'或'蝙蝠俠'。 – amalloy

+0

@amalloy,啊,我忽略了否則在問題中。 – user3237465