“外国进口数据Foo :: Type”和“数据Foo”之间的区别

时间:2018-03-04 10:15:24

标签: purescript

定义外来类型的名义方法之间是否存在功能差异? foreign import data Foo :: Type方法使意图更清晰,但是它是什么?

2 个答案:

答案 0 :(得分:4)

尽管它们在表面上看起来很相似,但它们在元语言中的表示方式却截然不同,因为每个元素在解析后都会产生不同的结构(前者为ExternDataDeclarationDataDeclaration为后者)。

例如,您可以派生数据声明的实例,但对外部数据声明执行此操作会引发错误。

-- 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类型编写一个空案例表达式。