和类型的结构类型输入

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

对于产品类型,名义类型与结构类型是在每种情况下都具有简单解释的设计决策;您可以使用相同的顺序和相同的字段定义两个相同的记录类型,但是名称不同;它们是兼​​容还是不兼容;很容易看到每种可能性如何导致一个连贯的类型系统。

对我来说,不清楚是否适用于总和类型;这样做的全部目的是保留标记名,以便您可以创建值并在以后区分它们。但是,在名词性和结构性类型的讨论中,我找不到任何提及此问题的信息。

是这种情况:

  1. [当然,名义类型与结构类型只适用于产品类型,总和类型必须是名义类型,这显然很明显,不用多说,所以没有人会提起它。
  2. 实际上,总和类型可以是结构化的,其方式如下,我没有想到...
  3. 还有什么?
types functional-programming language-agnostic theory discriminated-union
1个回答
0
投票

通过与您聊天,我理解您要问的是,一种新语言是否可以将等效和类型视为相同。例如,如果语法类似于ML,则可以定义

type Val  = Unparsed String | Parsed Int
type File = Filename String | FileDescriptor Int

关于ValFile是否被视为与产品类型相同的类型,可转换的类型或不相关的类型,您在这里有完全相同的选择。让我们浏览一些选项。

结构键入

一种可能的简单实现是对它们进行鸭子式处理。编写一种函数式语言,在其中您可以将File传递给需要Val的任何函数,并且该函数可以正常工作,这很奇怪。但这会起作用。该语言将查找定义,看到它们是等效的,并考虑它们彼此的别名。如果语言要求选项具有相同的名称,则可能会令程序员感到惊讶。

名义输入

如果您尝试在Haskell中进行等效处理,它将告诉您这是两种不同的类型。要将一个转换为另一个,您需要编写一个可以解包和重新打包的函数,例如

fromVal (Unparsed path) = Filename path
fromVal (Parsed fd)     = FileDescriptor fd

糊状的中间

我上面编写的转换函数显然不是最佳选择,因为这两种类型的布局和实现完全相同。在这里,该语言可能具有中间立场:您必须在类型之间进行显式转换,但是这种转换是无操作的。进一步产生矛盾的步骤可能是要求在某处声明以启用这种微不足道的转换,例如C ++中的default构造函数或Haskell中的deriving

这在命令式语言中很常见。例如,在C语言中,如果两个类型是“布局兼容的”,或者即使它们是前几个字段都是布局兼容的产品类型,也可以保证它们之间的类型修改。无处不在的套接字库依靠它来实现struct sockaddr,实际上是求和类型。但是,副作用是,如果实现的新网络协议具有32位字段和16位字段,则该语言将认为与IPv4地址和TCP或UDP端口号兼容。

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