gpt4 book ai didi

F# 奇数模式匹配问题

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

昨天在写一些代码时,我遇到了两个奇怪的问题,我和我的函数式编程 friend 都无法弄清楚。我们看了很长时间,在网上研究了它,但我们无法在任何地方找到任何答案,所以这里是:

问题是在这段代码中:

第一个奇怪的问题:

let outer1 (bs : byte array) =
let rec inner (bs : byte array) (bacc : byte array) (i : int) =
match i with
| bs.Length -> bacc // <--- Error: bs is not recognized. Why?
| _ -> bacc.[i] <- bs.[i]
inner bs bacc (i + 1)
inner bs (Array.zeroCreate bs.Length) 0

这里的问题是: FS0039: The namespace or module 'bs' is not defined.怎么会这样? bs 毕竟在函数签名中。此外,使用 let bsLength = bs.Length 定义一个新值在 match 之前工作.但是通过这样做,我看到了一个新的奇怪之处:
let outer2 (bs : byte array) =
let rec inner (bs : byte array) (bacc : byte array) (i : int) =
let bsLength = bs.Length
match i with
| bsLength -> bacc
| _ -> bacc.[i] <- bs.[i] // <--- Warning: Rule never matched. Why?
inner bs bacc (i + 1)
inner bs (Array.zeroCreate bs.Length) 0

这里的问题是一个警告,上面写着: warning FS0026: This rule will never be matched .
我完全不明白。 i并且数组的长度彼此没有关系。如果我写一个整数(例如 10 )而不是 bsLength ,警告消失。

最佳答案

您的两个问题都源于模式匹配允许互换使用值和文字的期望。不,不是的。 Pattern Matching (F#) MSDN 上的主题很好地概述了支持的模式类型及其应用程序的优先规则。简化冗长描述的主要原则是:你不能匹配一个值,除非这个值是 。字面量 , 或 标识符 (区分联合、异常标签或事件模式案例的案例值)。

在您的第一个问题点编译器处理 bs.Length不作为属性(property) Length数组 bs如您所料,但作为文字或标识符Length来自不存在的模块或命名空间 bs ;作为 John Palmer在他的回答中指出,您可以通过使用 来实现预期的行为变量 带有 guard statement 的模式.合法使用类似于您的模式匹配表达式的示例是:

module bs =
[<Literal>]
let Length = 100
//.............................
let v = 100;
let s = match v with
| bs.Length -> "matched"
| _ -> "not matched";;

val s : string = "matched"

第二个问题点被编译器视为 变量 模式和 bsLength赋值为 i而不是像您预期的那样比较值;第二个匹配规则没有机会启动。

关于F# 奇数模式匹配问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17272899/

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