定义外来类型的名义方法之间是否存在功能差异? foreign import data Foo :: Type
方法使意图更清晰,但是它是什么?
答案 0 :(得分:4)
尽管它们在表面上看起来很相似,但它们在元语言中的表示方式却截然不同,因为每个元素在解析后都会产生不同的结构(前者为ExternDataDeclaration
,DataDeclaration
为后者)。
例如,您可以派生数据声明的实例,但对外部数据声明执行此操作会引发错误。
-- This works
data Empty
derive instance eqEmpty :: Eq Empty
derive instance ordEmpty :: Ord Empty
-- This breaks
foreign import data Empty :: Type
derive instance eqEmpty :: Eq Empty
Error found:
Cannot derive a type class instance, because the type declaration for Empty could not be found.
在国外案例中,您必须自己编写这些实例。
我是PureScript的新手,所以我不知道是否有其他限制影响一个而不是另一个。我会说,出于所有实际目的,它们都是相同的。
答案 1 :(得分:3)
理论上,这两个声明具有不同的含义:x
没有居民(因此等同于Char
),但data X
有未知的居民。
目前它不是很重要,但是in the future它将为空Void
类型编写一个空案例表达式。