【发布时间】:2022-11-21 05:58:38
【问题描述】:
如果我 beta-reduce 以下表达式:
foldr (mappend . Sum) 1 [2]
= (mappend . Sum) 2 (foldr (mappend . Sum) 1 [])
= (mappend . Sum) 2 1
= mappend (Sum 2) 1
...
查看以下类型:
// mappend (<>) :: Monoid a => a -> a -> a
我们可以看到最后一行有类型错误,因为常量 1 应该属于 Monoid 类(但它不属于)。
然而,ghci 并没有抱怨。
为什么该表达式类型检查?
【问题讨论】:
-
了解术语的类型至关重要,两个数字文字是不是同一类型:
foldr ((<>) . Sum) (1 :: Sum Int) [2 :: Int] -
是的当然。对我来说,两种数字文字都有不同的类型。
标签: haskell