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

标签 list recursion error-handling f# type-conversion

我是一个相对较新的 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/

相关文章:

python - 为什么 remove() 实际上不删除 Python 列表中重复项的最后一个实例

python - 如何使用 python 中的 group() 方法进行列表理解?

python - 在 Python 中删除列表中的重复字典

python - 在Python中捕获特定的错误消息

c - 输入文本文件时文件无法正确输出

angular - HttpErrorInterceptor无法在Angular中重定向

python - 在 AND 和 OR 处拆分字符串,保留分隔符

c - 表达式必须是可修改的值

由于递归方法调用而导致Java堆栈溢出

java |仅使用递归和条件创建显式加法函数