我试图定义一个函数,您可以在其中传递要更新的记录的字段。首先,这可能吗?其次,这种类型是什么意思:
alterRecord : { b | b : a } -> c -> d -> { b | b : d }
alterRecord record b a = {record | b = a}
它看起来像包含自身的可扩展记录?真的很奇怪
我不想重复整个答案,因此对于是否可以将记录字段作为参数传递的长答案,简短答案为否,长答案为here。] >
关于另一个问题,类型是什么意思,让我们对其进行分解,并为类型变量提供较少混淆的名称:
{ r | field : a }
是foo类型的记录,至少具有一个field
类型的字段a
,其余记录由类型变量r
表示。同样,{ r | field : d }
至少具有一个类型为d
的字段,并与第一个记录类型共享其余字段,因为它们共享r
类型变量。
a -> b
是一种函数类型,它接受参数a
并返回b
,a -> b -> c
接受两个参数a
和b
(一次,一次,因为使用了currying),然后返回[C0 ]和儿子。
c
因此是一个带有三个参数的函数,某些记录类型具有字段{ b | b : a } -> c -> d -> { b | b : d }
的字段b
,其值未使用,某些字段a
的值,未使用,以及键入c
作为字段d
的值返回。
某些Hindley-Milner风格的编译器只是推断b
和a
是相同的类型,因为它们的用法不同。但是,Elm似乎坚持认为它们应该是不同的类型,并且将拒绝此代码,因为记录不能具有两个不同类型的单个字段。