gpt4 book ai didi

list - F# If 语句类型不匹配错误

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

我是一个相对较新的 F# 程序员,似乎每次我在代码中修复一个问题时都会出现另一个问题,所以我的问题是在转置递归函数内部,我想在其中运行一个 if-else 语句来检查输入是否真的有效与否,但是这个错误,我不知道为什么或如何解决它。
我已经有一个问题和标题非常相似的问题,但是由于各种原因,我被告知要提出一个新问题而不是编辑旧问题。

type Result<'T,'TError> =
| Ok of 'T
| Error of 'TError


let isValidTBL list =
match List.map List.length list |> List.distinct |> List.length with
| 1 -> true
| _ -> false



let Column_1 list =
if List.exists List.isEmpty list then [] // return empty list
else
list |> List.map List.head

let Column_2 list =
if List.exists List.isEmpty list then
Error "empty value"
else
list |> List.map List.tail |> Ok

let rec transpose list = [
if (isValidTBL list = false) then Error "Invalid Table"
else
match list with
| []::list -> ()
| list ->

yield Column_1 list
yield! transpose (Column_2 list) ]

警告 FS0020:此表达式的结果类型为 'Result<'a,string>' 并被隐式忽略。考虑使用 'ignore' 显式丢弃该值,例如'expr |> ignore' 或 'let' 将结果绑定(bind)到一个名称,例如'让结果 = expr'。
错误 FS0001:此表达式应具有类型
''列表列表'
但这里有类型
'结果<'b list list,string>'
提前致谢

最佳答案

关键问题是你试图混合Result用普通的 F# list .当您在列表推导中时,您只能使用 yield 返回值,所以当你写:

let rec transpose list = [
if (isValidTBL list = false) then Error "Invalid Table"
else
yield // (...)
]
Error "Invalid table" 的部分不是返回值,而只是您创建然后忽略的值。您可以通过重新排列代码以仅在 Ok 中启动列表理解来解决这一点。案子:
let rec transpose list =
if (isValidTBL list = false) then Error "Invalid Table"
else Ok [
yield // (...)
]
但是,这也不能解决您的所有问题,因为您希望递归调用 transpose如果这也在理解范围内,那么返回错误“为时已晚”。
您可以在没有理解的情况下编写此代码,但老实说,如果您仅使用异常处理错误,我认为这会容易得多:
exception InvalidTable
exception EmptyValue

let Column_2 list =
if List.exists List.isEmpty list then raise EmptyValue
else list |> List.map List.tail

let rec transpose list = [
if (isValidTBL list = false) then raise InvalidTable
else
match list with
| []::list -> ()
| list ->
yield Column_1 list
yield! transpose (Column_2 list) ]
您必须确保处理异常并且您可能希望将它们转换为 Error 使用 Result 时的值在整个项目中,但是这样代码会变得更简单。

关于list - F# If 语句类型不匹配错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64193907/

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