gpt4 book ai didi

f# - F# 3.0 中的事件模式被破坏

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

此事件模式使用 F# 2.0 编译:

let (|Value|_|) value = // 'a -> 'T option
match box value with
| :? 'T as x -> Some x
| _ -> None

但是,在 F# 3.0 中,会发出错误:

Active pattern '|Value|_|' has a result type containing type variables that are not determined by the input. The common cause is a [sic] when a result case is not mentioned, e.g. 'let (|A|B|) (x:int) = A x'. This can be fixed with a type constraint, e.g. 'let (|A|B|) (x:int) : Choice = A x'



我试过:

let (|Value|_|) value : 'T option = ...

和:

let (|Value|_|) (value: 'U) = ...

如何修复?

环境:Visual Studio 2012 (RTM) 和 FSI v11.0.50727.1

编辑:这是一个更简单的重现:

let (|X|) x = unbox x

最佳答案

F# 2.0 编译器中存在一个错误,即编译器对某些具有自由类型变量的事件模式进行了错误的分析和错误的代码生成;一个简单的重现是

let (|Check|) (a : int) = a, None
//let (|Check|) (a : int) = a, (None : int option)

let check a =
match a with
| Check (10, None) -> System.Console.WriteLine "10"
| Check (20, None) -> System.Console.WriteLine "20"

check 10
check 20

它在编译时生成一个奇怪的警告并编译成看似不正确的代码。我猜我们在 F# 3.0 中修复这个错误(并限制一些疯狂的情况)的尝试也破坏了一些法律代码作为修复的附带损害。

我将提交另一个错误,但对于 F# 3.0,听起来您需要使用其他答案中提到的解决方法之一。

关于f# - F# 3.0 中的事件模式被破坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11978234/

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