在Haskell中,提升型产品意味着(a,b,c)和(a,(b,c))之间存在语义差异.
如果所有产品的所有模式匹配总是无可辩驳的,则没有区别,(a,b,c)可能是(a,(b,c))的语法糖.
为什么Haskell会选择升降式产品?
haskell types programming-languages functional-programming lazy-evaluation
由于类型变量不能保存多类型,因此使用Rank*Types似乎不能重复使用现有函数,因为它们具有monotype限制.
例如,当中间类型是多类型时,我们不能使用函数(.).我们被迫在现场重新实施(.).这对于(.)来说当然是微不足道的,但对于更多实体代码来说却是一个问题.
我还认为((f.g)x)不等于(f(gx))对参考透明度及其益处的严重打击.
在我看来,这是一个显示停止问题,并且似乎使Rank*Types扩展几乎不适合广泛使用.
我错过了什么吗?是否有计划使Rank*Types与类型系统的其他部分更好地交互?
编辑:你如何使(runST.永远)的类型工作?
OS X上的SDL使用预处理器技巧使main()用自己的入口点重载,用Objective C编写,调用用户的main.
这些技巧使非C SDL用户(例如:Haskell绑定)的生命变得非常困难.
有这么好的理由吗?
为什么SDL不能在SDL_init中执行Objective-C Cocoa初始化?
我明白在:
f x = x + 1 where !y = undefined
爆炸模式的含义y是以前要评估的f.
同理:
f x = x + 1 where !(!a, !b) = (undefined, undefined)
意思是一样的,wrt x和y.
但爆炸模式意味着什么:
f x = x + 1 where (!a, !b) = (undefined, undefined)
它似乎不会导致未定义被评估.In-tuple爆炸模式什么时候开始生效?如果强制模式的元组?谁能给其中一个例子(!a, !b) = (..)不同于(a, b) = (..)?