定义外来类型的名义方法之间是否存在功能差异? foreign import data Foo :: Type
方法使意图更清晰,但是它是什么?
尽管它们在表面上看起来很相似,但它们在元语言中的表现方式却截然不同,因为每个元素在解析后都会产生不同的结构(前者为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的新手,所以我不知道是否有其他限制影响一个而不是另一个。我会说,出于所有实际目的,它们都是相同的。
从理论上讲,这两个声明具有不同的含义:data X
没有居民(因此相当于Void
),但import foreign data X :: Type
有不明身份的居民。
目前它无关紧要,但in the future它将为空data
类型写一个空案例表达将是可能的。