gpt4 book ai didi

haskell - 总和类型 - 为什么在 Haskell 中 `show (Int | Double)` 与 `(show Int) | (show Double)` 不同

转载 作者:行者123 更新时间:2023-12-04 05:45:04 32 4
gpt4 key购买 nike

为什么这些不相等?

show $ if someCondition then someInt else some double



if someCondition then show someInt else show someDouble

我知道如果您隔离 if ... else将第一个示例中的一部分单独转换为表达式,那么您不能用匿名求和类型表示其类型, Int | Double 的类型,就像你可以在 TypeScript 中轻松完成的事情(提到 TypeScript,因为它是我经常使用的语言并且支持 Sum 类型),并且不得不求助于使用 Either然后基于它的数据将调用 show .

我在这里给出的例子是微不足道的,但对我来说,认为“好吧,我们要展示一些东西,并且一些东西取决于 someCondition”而不是“好的,如果 someCondition 为真,则显示 someInt,否则显示 someDouble”,并且还允许更少的代码重复(这里显示重复两次,但它也可能是一个长函数应用程序,而不是 if ... else 可能有 >2 个分支需要考虑)

在我看来,编译器应该很容易检查每个构成 sum 类型的类型(此处为 Int | Double )是否可以用作 show 的参数函数并决定类型是否正确。更好的是 show函数总是返回 string无论参数的类型如何,编译器都不必携带所有可能的“分支”(所以所有可能的类型)。

是否选择不存在这样的功能?还是我认为实现起来更难?

最佳答案

表达式的所有部分都必须是正确类型的。 if someCondition then someInt else someDouble的类型必须类似于 exists a. Show a => a ,但 Haskell 不支持这种存在量化。

更新:如 chi points out in a comment ,如果 Haskell 支持联合/交集类型(与 sum/product 类型不同),这也是可能的,但不幸的是它不支持。

关于haskell - 总和类型 - 为什么在 Haskell 中 `show (Int | Double)` 与 `(show Int) | (show Double)` 不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58783024/

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