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

问题描述 投票:4回答:2

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

purescript
2个回答
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的新手,所以我不知道是否有其他限制影响一个而不是另一个。我会说,出于所有实际目的,它们都是相同的。


3
投票

从理论上讲,这两个声明具有不同的含义:data X没有居民(因此相当于Void),但import foreign data X :: Type有不明身份的居民。

目前它无关紧要,但in the future它将为空data类型写一个空案例表达将是可能的。

© www.soinside.com 2019 - 2024. All rights reserved.