为什么这些不相等?
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为true,则显示someInt,否则显示someDouble”,并且也允许减少代码重复(此处的显示重复了两次,但它也可能是一个长函数的应用程序,而不是if ... else
可能要考虑的> 2个分支)
在我看来,对于编译器而言,检查构成求和类型的每种类型(在此处Int | Double
)是否可以用作show
函数的参数并确定类型是否正确应该很容易。更好的是,无论参数的类型如何,show
函数总是会返回string
,因此编译器不必随身携带所有可能的“分支”(因此所有可能的类型)。
是否选择不存在这样的功能?还是我认为实施起来更加困难?
making all conversions explicit
。在我的问题中,我不希望Haskell将a转换Int
为a Double
,反之亦然。我仅以这两种类型为例。你可以每天更换Int
与a
和Double
与b
我的问题,其中两种类型的派生Show
。我知道anonymous sum types
Haskell 中没有这种语言,但是我想知道为什么会这样,是什么使我们无法设计具有这种语言的语言。
x :: Int | Bool
并且我们必须进行编译show x
,则没有简单的方法来知道show
在基于类型擦除的RTS中使用哪个指针指向函数。我们可能需要在运行时保留一些类型级别的信息。
(String, Int)
不是匿名的。它只是具有有趣语法的常规产品类型。(String | Int)
将会有很大的不同。首先问自己是否(Int|Int)
应该相同Int
以及为什么相同。
if ... then ... else ...
,then
和else
部分必须具有相同的类型。在某些编程语言中,您可以将其视为三元运算符。