gpt4 book ai didi

haskell - 为什么表达式 `foldr (mappend . Sum) 1 [2]` 会进行类型检查?

转载 作者:行者123 更新时间:2023-12-02 15:45:03 25 4
gpt4 key购买 nike

如果我 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 不会提示。

为什么要检查表达式类型?

最佳答案

简答:1 被解释为 Sum a,因此您的文件夹类型为:

foldr (mappend . Sum) 1 [2] :: Num a => Sum a

2 的类型为 a1 的类型为 Sum a

Sum aNum 的实例,如果 aNum 的实例,实际上,the source code says [src] :

newtype Sum a = Sum { getSum :: a }
deriving ( Eq -- ^ @since 2.01
, Ord -- ^ @since 2.01
, Read -- ^ @since 2.01
, Show -- ^ @since 2.01
, Bounded -- ^ @since 2.01
, Generic -- ^ @since 4.7.0.0
, Generic1 -- ^ @since 4.7.0.0
, Num -- ^ @since 4.7.0.0
)

这意味着如果你写一个整数文字,比如1,它可以被构造为一个Sum a对于任何aNum 的实例,所以 1::Sum IntegerSum 1

这意味着 foldr 中的 1 具有类型 Sum a,例如:

   mappend (Sum 2 :: Sum Integer) (1 :: Sum Integer)
-> Sum (2 + 1)
-> Sum 3

关于haskell - 为什么表达式 `foldr (mappend . Sum) 1 [2]` 会进行类型检查?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74512291/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com