【发布时间】:2022-07-06 01:40:00
【问题描述】:
我正在 OCaml 中编写一个函数,它使用 type 选项和 List.fold_right 返回列表中最长的列表。
let longest (lst : 'a list list) : 'a list option =
List.fold_right (fun (i : 'a list) (y : 'a list option) -> if List.length i > List.length y then (Some i) y else y) lst None
但是我不断收到以下错误。
This expression has type 'a list option
but an expression was expected of type 'b list
该函数应返回Some,后跟最长列表,如果为空,则返回None。
【问题讨论】:
-
模式首先匹配列表。如果为空,则返回 None,如果
x::xs返回Some ...,则使用 x 作为折叠的初始元素。无需每次都在折叠内构造和匹配选项,避免您的类型错误。 -
let longest( lst : 'a list list) (x : 'a list option) = match lst with | [] -> None | x :: xs -> Some ( List.fold_right (fun i y -> if List.length i > List.length y then i else y) x xs)`此表达式的类型为'a list list list,但表达式应为'a list 类型。类型变量'b 出现在'b list list 中`但是,当我收到此错误时我试图模式匹配 -
你混淆了 List.fold_right 的参数,
x xs应该是xs x。 -
什么是最长的未使用的
x参数? -
哦,那是我的错,该函数应该返回“列表选项”。谢谢指出