我是 Haskell 的新手,所以这可能很明显,但我做了很多 Prolog,所以我对这个感到困惑......
在使用 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
然后我很惊讶地看到这个值2
实际上与1
. 为了确保我不希望不可能的事情发生,我还尝试了以下操作,以确认在 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)以上函数来自优秀书籍《Programming in Haskell》第93页