我是新來的Haskell所以它可能是顯而易見的,但我沒有Prolog的廣泛所以我很困惑這一個...Haskell的元組不能與函數參數匹配
當使用GHCI,我創建了以下功能(1):
Prelude> let find k t = head [v | (k',v) <- t, k == k'] -- Definiton of find
find :: Eq a1 => a1 -> [(a1, a)] -> a
Prelude> find 2 [(1,11),(2,22)] -- Invocation of find
22
這是預期的。然後我試圖從定義中刪除的K」:
Prelude> let find2 k t = head [v | (k,v) <- t]
find2 :: t -> [(t1, a)] -> a
Prelude> find2 2 [(1,11),(2,22)]
11
當時我很驚訝地看到1
實際相匹配的值2
。 只是可以肯定我是不是希望能爲不可能,於是我也嘗試以下列來確認部分匹配可能在Haskell,這看起來確實是這樣的:
Prelude> head [v | (2,v) <- [(1,11),(2,22)]]
22
我還注意到一個差異在函數聲明中。我添加了所需的信息,因此find
和find2
的聲明看起來完全一樣。但結果仍然是斷開的(2,_)
matchnig (1,11)
:
Prelude> let find2 :: Eq a1 => a1 -> [(a1, a)] -> a; find2 k t = head [v | (k,v) <- t]
find2 :: Eq a1 => a1 -> [(a1, a)] -> a
Prelude> find2 2 [(1,11),(2,22)]
11
如何2
通過任何手段來匹配1
?
(1)上述函數來源於優良書「在Haskell編程」第93頁
簡單的講,序言不統一,Haskell只做模式匹配。 – chi
無聊的實用建議:在學習時使用'-Wall'會非常有幫助(以及以真實代碼捕捉問題) – jberryman