gpt4 book ai didi

haskell - 类型约束中的函数

转载 作者:行者123 更新时间:2023-12-03 16:19:59 25 4
gpt4 key购买 nike

(Just (+2)) <*> (Just (+2))的检查类型
我发现它有约束 Num (a -> a) ,这让人困惑 Num (a -> a)应该是这里

(Just (+2)) <*> (Just (+2)) :: (Num a, Num (a -> a)) => Maybe (a -> a)

最佳答案

我们先来分析一下类型。 Just (+2)有类型 Just (+2) :: Num a => Maybe (a -> a) , 和 (<*>)有类型 (<*>) :: Applicative f => f (c -> d) -> f c -> f d .
如果我们这样构造一个表达式 (<*>) (Just (+2)) (Just (+2)) ,则该类型等价于:

(<*>) :: Applicative f => f (c -> d)     -> f c            -> f d
Just (+2) :: Num a => Maybe (a -> a)
Just (+2) :: Num b => Maybe (b -> b)
-----------------------------------------------------------------
f ~ Maybe, a ~ c ~ d, c ~ (b -> b)
因此,这意味着应用类型是 Maybe ,以及 a , cd是相同的类型,而且 c相当于 (b -> b) .由于存在类型约束 Num a , 和 a ~ c ,这意味着类型约束也适用于 c ,因此 Num b => (b -> b)需要是 Num 的一个实例类型类。因此,这种类型的结果是:
(<*>) (Just (+2)) (Just (+2)) :: Num b => Maybe (b -> b)
这是有道理的,因为 Just (+2) <*> Just (+2) 的结果将是 Just ((+2) + 2) ,以及自 (+)有类型 (+) :: Num a => a -> a -> a ,因此它期望第一个操作数 (+2)这是一个函数,它的类型应该是 Num 的实例.

关于haskell - 类型约束中的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64838570/

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