我是新来的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