定义外来类型时,名义方法之间有什么功能差异吗?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
有未知的居民。
目前,无论哪种方式都没有多大关系,但将来可以为空data
类型编写空大小写表达式。