gpt4 book ai didi

Haskell:与自己的数据类型混淆。记录语法和唯一字段

转载 作者:行者123 更新时间:2023-12-03 15:27:43 25 4
gpt4 key购买 nike

我刚刚发现了这种困惑,并希望确认它就是这样。当然,除非我只是错过了一些东西。

说,我有这些数据声明:

data VmInfo = VmInfo {name, index, id :: String} deriving (Show)
data HostInfo = HostInfo {name, index, id :: String} deriving (Show)

vm = VmInfo "vm1" "01" "74653"
host = HostInfo "host1" "02" "98732"

我一直在想,而且似乎很自然和合乎逻辑的是:
vmName = vm.name
hostName = host.name

但这显然是行不通的。我懂了。

问题

所以我的问题是。
  • 当我使用记录语法创建数据类型时,我是否必须确保所有字段都有唯一的名称?如果是 - 为什么?
  • 有没有一种干净的方法或类似于“范围解析运算符”的东西,比如 ::.等,以便 Haskell 区分 name 的数据类型。 (或任何其他非唯一字段)属于并返回正确的结果?
  • 如果我有多个具有相同字段名称的声明,那么正确的处理方法是什么?


  • 作为旁注。

    一般来说,我需要返回类似于上面示例的数据类型。
    首先,我将它们作为元组返回(当时在我看来是正确的方式)。但是元组很难使用,因为不可能像使用“!!”的列表那样简单地提取复杂类型的各个部分。所以接下来我想到了字典/哈希。
    当我尝试使用字典时,我想拥有自己的数据类型有什么意义呢?
    玩/学习数据类型我遇到了导致我提出上述问题的事实。
    所以看起来我更容易使用字典而不是自己的数据类型,因为我可以为不同的对象使用相同的字段。

    您能否详细说明一下并告诉我它在现实世界中是如何完成的?

    最佳答案

    Haskell 记录语法有点 hack,但记录名称以函数的形式出现,并且该函数必须具有唯一的类型。因此,您可以在单一数据类型的构造函数之间共享记录字段名称,但不能在不同数据类型之间共享。

    What is the correct way to deal with this if I have several declarations with the same field names?



    你不能。您必须使用不同的字段名称。如果要从记录中选择重载名称,可以尝试使用类型类。但基本上,Haskell 中的字段名称不像 C 或 Pascal 那样工作。将其称为“记录语法”可能是一个错误。

    But tuples are hard to work with as it is impossible to extract individual parts of a complex type



    实际上,使用模式匹配可以很容易地做到这一点。例子
    smallId :: VmInfo -> Bool
    smallId (VmInfo { vmId = n }) = n < 10

    至于在“现实世界”中如何做到这一点,Haskell 程序员倾向于严重依赖在编译时知道每个字段的类型。如果您希望字段的类型发生变化,Haskell 程序员会引入一个类型参数来携带变化的信息。例子
    data VmInfo a = VmInfo { vmId :: Int, vmName :: String, vmInfo :: a }

    现在你可以拥有 VmInfo String , VmInfo Dictionary , VmInfo Node ,或任何你想要的。

    摘要: 每个字段名必须属于唯一类型 ,并且有经验的 Haskell 程序员使用静态类型系统而不是试图绕过它。你肯定想了解模式匹配。

    关于Haskell:与自己的数据类型混淆。记录语法和唯一字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9354753/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com