【发布时间】:2021-10-22 08:31:49
【问题描述】:
我有一般的函数式编程经验,但我是 F# 新手,无论我尝试什么都无法编译这段代码:
let group2<'T> (sq: seq<'T>) : seq<'T * 'T> =
Seq.fold (fun (p, l) b -> match p with
| None -> (Some b, l)
| Some v -> (None, (v, b) :: l)) (None, []) sq
我不明白这条错误消息试图告诉我什么,而且我终其一生都无法弄清楚为什么它不能按原样编译;
main.fs(2,19): error FS0001: This expression was expected to have type
'seq<'T * 'T>'
but here has type
''a * 'b'
main.fs(4,65): error FS0001: This expression was expected to have type
'seq<'T * 'T>'
but here has type
''a * 'b'
有更多 F# 经验的人有什么建议吗?
【问题讨论】:
-
我真的不知道你想要达到什么目的。你能发布一些你认为你的函数应该返回的示例值吗?也许您熟悉的其他语言的示例代码可以实现相同的效果?
-
如果添加行 |> snd |> Seq.ofList 与 Seq.fold 对齐,则可以强制编译,但这没有任何意义。
-
您的返回类型注释不是您的代码在做什么。您期待一个元组列表,但您正在创建一个
(option, list)的元组 -
我应该更清楚一点,该函数应该将每 2 个元素配对成一个元组列表。我想我没有意识到的是它实际上返回了状态,其中包含一个无关的内部值,以及作为两个元素返回的实际列表。
-
请用您评论中的信息更新问题。
标签: list types functional-programming f#