gpt4 book ai didi

haskell - 为什么这个 Haskell 表达式可以编译?

转载 作者:行者123 更新时间:2023-12-02 16:09:44 25 4
gpt4 key购买 nike

这是我写的一些定义,以避免混合货币

{-# LANGUAGE GeneralizedNewtypeDeriving #-}

data EUR
data USD

newtype Amount a = Amount Double deriving (Fractional, Num, Show)

eur :: Double -> Amount EUR
eur = Amount

usd :: Double -> Amount USD
usd = Amount
  • 34 ​​美元 + 3 美元 按预期进行类型检查
  • usd 33 + eur 33 正如预期的那样是一个编译错误
  • 我很惊讶,但根据编译器的说法,usd 33 + 3 是可以的。我想避免但不明白的事情。我怀疑是因为Num实例,但是与第二种情况有什么区别?

您能否解释一下为什么 usd 33 + 3 可以编译,以及是否可以让类型检查器拒绝此表达式。

最佳答案

Haskell 中的数字有很多隐含性。从心理上讲,您应该将每个数字文字(如 3)替换为 fromInteger 3。由于 Amount 使用 GeneralizedNewtypeDeriving 作为 Num 类型类的一部分,因此它继承了 fromInteger 实例。所以编译器正在这样做

usd 33 + 3
=== [implicit fromInteger & expand usd]
(Amount 33 :: Amount USD) +
fromInteger 3
=== [fromInteger :: Num a => a -> Amount a]
(Amount 33 :: Amount USD) +
(Amount 3 :: Amount a)
=== [unify a]
(Amount 33 :: Amount USD) +
(Amount 3 :: Amount USD)

关于haskell - 为什么这个 Haskell 表达式可以编译?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17844999/

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