gpt4 book ai didi

haskell - 语义(Haskell)受推断类型(返回类型多态性)的影响是什么意思?

转载 作者:行者123 更新时间:2023-12-03 21:20:56 24 4
gpt4 key购买 nike

Here the commentator writes :

Finally, given enough macro magic this could be done... but likely for now less effort than implementing a Haskell-style type system atop Clojure. Typed Clojure could be a great model for this except it's been explicitly designed so that the semantics of Clojure cannot be affected by the inferred types. This is exactly what happens in return type polymorphism and so it's explicitly impossible in Typed Clojure.



我的问题是 - 语义(Haskell)受推断类型(返回类型多态性)的影响是什么意思?

最佳答案

考虑 read函数,它有一个(ad-hoc)多态返回值:

read :: (Read a) => String -> a

实现并不那么重要。唯一重要的部分是实现依赖于 Read 的实例。在编译时选择,并且该推断可能导致为对 read 的同一调用选择不同的类型.
addFive :: Int -> Int
addFive x = x + 5

main :: IO ()
main = do
print (addFive (read "11"))
putStrLn (read "11")

有电话到 read用同样的论点两次。 Haskell 需要引用透明性,所以它必须两次产生相同的结果,对吧?嗯,不完全是。推断的返回类型很重要。在 print行,推断的返回类型为 Int .在 putStrLn行,推断的返回类型为 String .而且因为它是临时多态的,所以语义会随着类型变量的变化而变化。
print行将打印出 16。 putStrLn行会崩溃,因为 "11"不是 read 的输入将成功解码为 String .

而且由于类型变量只出现在返回类型中,所以在调用函数时没有该类型的值。没有办法在运行时调度一个值的类型来确定 Read 的哪个实例使用。弄清楚它的唯一方法是在编译时知道类型。所以 Typed Clojure 不能这样做——这意味着语义依赖于编译时类型。

编辑地址评论

我不知道它是否应该给你留下深刻印象。但是由于您的陈述(2)在所有可能的方面都是错误的,这表明即使理解这个例子也明显缺乏基础。我想我必须一直回到 Haskell 中类型变量的含义来解释这一点。

Haskell 中的类型变量表示由调用者选择的未知但具体的类型。类型 Read a => String -> a并不意味着函数根据其输入为其返回值选择一种类型。这意味着该函数根据其输出的类型选择其工作方式。

也许 read是一个不好的例子,因为它的不同行为只有在由于输入错误而引发异常时才会看起来特别不同。对于没有使用 Haskell 类型系统经验的人来说,很容易将其与运行时强制转换异常之类的东西混为一谈,即使它完全不同。

你的说法(2)是完全错误的。程序不会崩溃,因为 read返回 Int代码预期 String , 和类似 ClassCastException 的东西发生。程序崩溃是因为 read 选择了一个解析器来解析 String编译时基于其返回类型的文字 ,但给出的输入不是有效的 String文字。 (相比之下, "\"11\"" 是有效的 String 文字,因为它被引用了。)

粗体部分是重要部分。 read函数根据返回类型选择它将在编译时使用的解析器。这既是一种非常强大的技术,也是 Typed Clojure 无法做到的。

关于haskell - 语义(Haskell)受推断类型(返回类型多态性)的影响是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23282921/

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