gpt4 book ai didi

Haskell 为什么要进行这种类型检查

转载 作者:行者123 更新时间:2023-12-02 18:29:41 25 4
gpt4 key购买 nike

import Data.Monoid

newtype Constant a b =
Constant { getConstant :: a }
deriving (Eq, Ord, Show)

instance Functor (Constant a) where
fmap _ (Constant a) = Constant a

instance (Monoid a) => Applicative (Constant a) where
pure x = Constant (mempty x )
_ <*> (Constant a) = Constant a

--:t (<*>)
--(<*>) :: Applicative f => f (a -> b) -> f a -> f b

--:t Constant (Sum 1)
--Constant (Sum 1) :: Num a => Constant (Sum a) b

--Constant (Sum 1) <*> Constant (Sum 2)
--Constant { getConstant = Sum { getSum = 2 }}

我的问题是为什么最后一个语句类型要检查?

我预计 <*> 的左侧是 f ( a -> b) 类型
哪里
f = 常数
(a -> b) = 总和 1?

我无法应用任何内容(Sum 1),因为它已完全应用,但此语句可以编译。

最佳答案

左边f (a -> b)。这是正确的。

记住这里的类型(为了简单起见,让我们使用1::Int):

Constant (Sum 1) :: forall a. Constant (Sum Int) a

我添加了显式的forall。类型检查器可以将 a 与任何内容统一起来。

试试这个:

Constant (Sum 1) :: Constant (Sum Int) (a -> b)

工作正常。

关于Haskell 为什么要进行这种类型检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34699613/

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