在GHCi中使用let部分应用fst和snd会给出一个奇怪的类型签名

时间:2013-07-25 14:35:57

标签: haskell binary-tree ghci

我正在实现一个相当普通的二叉树,我正在实现一个insertWith函数,这样你就可以通过将现有值转换为它们的“键”来插入值 - 这可能允许你,比方说,存储(键,值)元组,并在插入新“节点”时比较键。实施如下:

insertWith :: (Ord b) => (a -> b) -> BinTree a -> a -> BinTree a
insertWith _ EmptyTree    y = Node y EmptyTree EmptyTree
insertWith f (Node x l r) y =
    case compare (f y) (f x) of
        LT -> Node x (insertWith f l y) r
        EQ -> Node x l r
        GT -> Node x l (insertWith f r y)

当我在GHCi中使用fstlet部分应用于此时,我会得到以下信息:

let insertWith_ = insertWith fst
:t insertWith_
insertWith_ :: BinTree ((), b) -> ((), b) -> BinTree ((), b)

但是,省略let步骤会产生以下结果:

:t insertWith fst
insertWith fst
  :: (Ord a) => BinTree (a, b) -> (a, b) -> BinTree (a, b)

我认为它与类型签名中的(Ord b)有关,但我只是想知道为什么GHCi在使用let时会像这样转换类型签名?提前感谢您的任何答案。

0 个答案:

没有答案