gpt4 book ai didi

compiler-errors - 无法确定 F# 函数中的对象类型

转载 作者:行者123 更新时间:2023-12-02 07:25:38 24 4
gpt4 key购买 nike

我在 F# 中有以下函数,但不幸的是,在我折叠开头的 Seq.filter 中,w2.Text(在比较中)未被识别为 Word 类型。我不确定在这种情况下如何帮助编译器。编译器似乎对其他一切都很好。这是我第一次遇到这种情况。

let CreateWordRelationDB () =
let db = new AnnotatorModel()
printfn "%s" "Entered Function and created db v7"
let tweets = db.Tweets
|> Seq.cast<Tweet>
|> Seq.map(fun t -> t.Text)
let words = db.Words |> Seq.cast<Word>
words
|> Seq.fold(fun acc w1 ->
let filtacc = acc
|> Seq.filter(fun w2 ->
if(w1.Text = w2.Text) then false else true)
filtacc
|> Seq.map(fun w2 -> CreateWordRelation w1 w2 tweets)
|> Seq.iter(fun r -> db.WordRelations.Add(r) |> ignore)
db.SaveChanges() |> ignore
filtacc
) words

最佳答案

有一种——可以说——比使用类型注解更优雅的方式。

这里的问题是非 F# 类型(Word 本质上是)的类型推断不如 F# 记录/DU 类型强大。如果相应的值出现在代码中 之前 使用它的地方,编译器只能推断它们的类型(所以它不是那么多推断,而是更多的“类型跟踪”)。

您正在以这种方式使用 fold:source |> Seq.fold folder state

因此state,其类型仍然需要确定,发生在folder函数之后,也就是使用它的地方。但是,您可以使用不太知名的 ||> 运算符将其移动到该点之前。

此运算符定义为 let inline (||>) (a, b) f = f a b 并允许您将两个单独的参数“柯里化(Currying)”到一个函数上:(state, source) ||> Seq.fold 文件夹

这样,state 发生在 folder 需要了解其类型之前,编译器可以“记住”该类型并在相关位置使用它。

有了它,你的函数调用看起来像

(words, words) // The first is the state, the second the source
||> Seq.fold (fun acc w1 -> ... // long folder function)

folder 函数柯里化(Currying)到 Seq.fold 之后没有进一步的参数。

(这一切都归功于我从 Ross McKinlay 那里学到的。)

关于compiler-errors - 无法确定 F# 函数中的对象类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32254041/

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