是否可以定义一个函数,您可以在其中传递要更新的记录的字段? [关闭]

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

我试图定义一个函数,您可以在其中传递要更新的记录的字段。首先,这可能吗?其次,这种类型是什么意思:

alterRecord : { b | b : a } -> c -> d -> { b | b : d }
alterRecord record b a = {record | b = a}

它看起来像包含自身的可扩展记录?真的很奇怪

elm
1个回答
0
投票

我不想重复整个答案,因此对于是否可以将记录字段作为参数传递的长答案,简短答案为否,长答案为here。] >

关于另一个问题,类型是什么意思,让我们对其进行分解,并为类型变量提供较少混淆的名称:

{ r | field : a }是foo类型的记录,至少具有一个field类型的字段a,其余记录由类型变量r表示。同样,{ r | field : d }至少具有一个类型为d的字段,并与第一个记录类型共享其余字段,因为它们共享r类型变量。

a -> b是一种函数类型,它接受参数a并返回ba -> b -> c接受两个参数ab(一次,一次,因为使用了currying),然后返回[C0 ]和儿子。

c因此是一个带有三个参数的函数,某些记录类型具有字段{ b | b : a } -> c -> d -> { b | b : d }的字段b,其值未使用,某些字段a的值,未使用,以及键入c作为字段d的值返回。

某些Hindley-Milner风格的编译器只是推断ba是相同的类型,因为它们的用法不同。但是,Elm似乎坚持认为它们应该是不同的类型,并且将拒绝此代码,因为记录不能具有两个不同类型的单个字段。

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