gpt4 book ai didi

haskell - ghc 如何进行类型推断

转载 作者:行者123 更新时间:2023-12-02 21:26:22 25 4
gpt4 key购买 nike

我正在阅读 Paul Hudaks 强烈推荐的书 Haskell School of Expression 。在第 13 章中我偶然发现了这个定义

type Time = Float

newtype Behavior a = Beh (Time -> a)

作者声明了新类型Behavior的几个实例:EqShowNumFractionalFloating,但其中只有这些实例声明之一中的一个函数困扰着我:

instance Num a => Num (Behavior a) where
(+) = lift2 (+) -- This one!
fromInteger = lift0 . fromInteger

lift0 :: a -> Behavior a
lift0 x = Beh (\t -> x)

lift2 :: (a -> b -> c) -> (Behavior a -> Behavior b -> Behavior c)
lift2 g (Beh a) (Beh b)
= Beh (\t -> g (a t) (b t)) -- Or actually this one.

time :: Behavior Time
time = Beh (\t -> t)

作者在此之后描述,通过这些新函数声明,我们现在可以编写 time + 5 ,从而将 (+) 运算符提升到行为领域,或者类似的东西。这对我来说听起来不错,所以我边读边点头微笑。突然,作者解释说:(time + 5) 相当于 Beh (\t -> t + 5),听起来完全是一塌糊涂。他实际上甚至提供了表达式的展开来证明这一点:

time + 5
==> { unfold overloadings for time, (+), and 5 }
(lift2 (+)) (Beh (\t -> t)) (Beh (\t -> 5))
==> { unfold lift2 }
(\ (Beh a) (Beh b) -> Beh (\t -> a t + b t)) (Beh (\t -> t)) (Beh (\t -> 5))
==> { unfold anonymous function }
Beh (\t -> (\t -> t) t + (\t -> 5) t )
==> { unfold two anonymous functions }
Beh (\t -> t + 5)

更具体地说,这是我无法理解的。对我来说,正确的说法是:time + (Beh 5) 相当于 Beh (\t -> t + 5)。但是当我推断 ghci 中的类型时,它告诉我(当然)作者是对的,而我在某种形式上很愚蠢。有人可以向我解释一下吗?

最佳答案

(+) 的类型为 Num a => a -> a -> a。这里的a行为 float 。代码中的文字 5 使用 fromInteger 转换为 Behavior Float,它应该类似于 fromInteger n = Beh (\t -> fromInteger n).

Beh 5 不会进行类型检查,因为 Beh 包装了 Float -> a 类型的函数,而不是数字。

关于haskell - ghc 如何进行类型推断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24865757/

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