haskell - 为什么 LiberalTypeSynonyms 在这种情况下没有帮助?
问题描述
{-# LANGUAGE KindSignatures, LiberalTypeSynonyms #-}
module Main where
data Optionally (f :: * -> *) (w :: *) = OMain w | OWrap (f w)
type MyEither1 = Either ()
type MyEither2 x = Either () x
type Works = Optionally MyEither1 Int
type Doesnt = Optionally MyEither2 Int
LiberalTypeSynonyms
将产生与不存在相同的错误:
The type synonym ‘MyEither2’ should have 1 argument, but has been given none
从这里的描述来看,它似乎应该首先扩展类型同义词,然后检查有效性,这对于两种类型应该是相同的。
解决方案
Haskell 通常不允许部分应用类型同义词。因此,在您的示例中,(MyEither2 Int)
可以作为类型参数传递,但MyEither2
不能,即使参数需要 kind * -> *
。
造成这种情况的原因是深刻而多毛的,完整的解释可以在这里找到,以及为纠正这个问题所做的工作的细节。
LiberalTypeSynonyms
取消了对类型同义词的一些限制,并允许将部分应用的类型同义词传递给另一个类型同义词。但是在您的示例中,部分应用的类型同义词被传递给正确的类型,这对于 GHC 来说(还)是不可能的。
推荐阅读
- nunit-3.0 - 将 NUnit3 XML 合并为一个 HTML 以发布到 Jenkins
- c# - HttpClient PostAsync 取消请求
- snakemake - snakemake + 奇点,摆脱python依赖
- netlogo - NetLogo - 不超过 5% 的人口具有一定的变量值
- ignite - 点燃数据流媒体优化
- javascript - JavaScript - 将对象内的对象推送到全局数组
- flutter - 如何忽略某个 GestureDetector 小部件的触摸并在 Flutter 中检测外部触摸?
- git - 即使本地主服务器从远程进行多次提交,如何在暂存之上重新定位?
- c++ - 我编写的 HSL 到 RGB 颜色空间函数无法正常工作
- javascript - 邮递员从 JSON 中获取值,其中等于使用 javascript 的数组中的值