"foreign import data Foo :: Type"和"data Foo"之间的区别



定义外来类型时,名义方法之间有什么功能差异吗?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类型编写空大小写表达式。

最新更新