我正在实现一个相当普通的二叉树,并且我正在实现一个insertWith
函数,这样您就可以通过将现有值转换为它们的“键”来插入值 - 例如,这可能允许您存储一个元组 (key, value ) 并在插入新的“节点”时比较键。实现如下:
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 中fst
使用部分应用它时let
,我得到以下信息:
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 时会像这样转换类型签名?提前感谢您的任何答案。