gpt4 book ai didi

recursion - F# - 匿名记录的递归

转载 作者:行者123 更新时间:2023-12-01 23:01:37 25 4
gpt4 key购买 nike

给定以下 F# 片段:

type A(children: A list) = 
member val P1 = ""
member val P2 = ""
member val Children = children

type B = {
F1:string
Children: B list
}

let rec f1 (a:A) =
{
F1 = a.P1
Children = a.Children |> List.map f1
}

let rec f2 (a:A) =
{|
F1 = a.P1
Children = a.Children |> List.map f2 //Error
|}

let a = A([A([A([])])])

f1 a
f2 a

////////////////////
Error FS0001 Type mismatch. Expecting a
'A -> 'a'
but given a
'A -> {| Children: 'a list; F1: string |}'
The types ''a' and '{| Children: 'a list; F1: string |}' cannot be unified.Active

编译器在 f2 中报错,但在 f1 中不报错。

匿名记录的正确语法是什么(如果存在)?

最佳答案

不会有正确的语法,这是不可能的。

想想f2 的返回类型是什么。因为它是一个包含字段 Children 的记录,它是同一记录的列表,它看起来像这样:

{|
F1: string
Children: list<
{|
F1: string
Children: list<
{|
F1: string
Children: list<
...
>
|}
>
|}
>
|}

它是一个无限类型。这样的野兽不存在。

问:但是 Fyodor,Children 列表中的元素显然是完全相同的记录,难道不能就是这样吗?

嗯,不,没有办法说“完全相同的记录”,因为它没有名字。编译器会像“什么记录?和什么完全一样?

另一方面,当你声明一个命名记录时,你可以使用同一个记录作为列表的元素,因为现在记录本身就是一个“东西”。它有自己的身份,与其内容分开,因此可以与其内容分开引用。

不过我认为错误消息可能更清楚。

关于recursion - F# - 匿名记录的递归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71700135/

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