gpt4 book ai didi

haskell - 我可以键入部分记录吗?

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

我有一个 Person带有名称和 id 以及函数 createPerson 的记录返回 Person没有 id ,将生成 UUID 留给调用者。:

-- Person.hs
import Data.UUID (UUID)

data Person = Person { name :: String, id :: UUID }

createPerson name = Person { name = name }
有没有办法输入 Person没有 id , 通知来电者 id Person会抛出异常吗? 我考虑过定义 PartialPerson如下:
data PartialPerson = { name :: String }
但是当我想添加或更改字段时,这很快就会变得很麻烦。

最佳答案

没有身份证的人的一种可能类型是:

type PersonWithoutId = UUID -> Person
问题是我们不能打印这种类型的值,或者检查它们的其他字段,因为函数是不透明的。

另一种选择是参数化类型:
data Person a = Person { name :: String, personId :: a }
type PersonWithId = Person UUID
type PersonWithoutId = Person ()
这样做的好处是您仍然可以轻松派生有用的类型类。

第三种选择是从人员中删除 id 并在需要时使用一对:
type PersonWithId = (UUID,Person)
或使用专用类型:
data WithId a = WithId { theId :: UUID, theValue :: a } deriving Functor
第三种选择的问题在于,拥有对两种类型的人都适用的功能变得更加麻烦。
此外,自动派生的 FromJSONToJSON实例可能会有不希望的嵌套。
当有多个可选属性时,它的可扩展性不是很好。

关于haskell - 我可以键入部分记录吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66241916/

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