gpt4 book ai didi

ocaml - 从位置到元素的函数转换

转载 作者:行者123 更新时间:2023-12-01 07:35:37 24 4
gpt4 key购买 nike

我有这个列表组合:list + undefined list我编写此函数以从该位置返回元素。

let name_of_num list undefined_list len_undefined k =
if k < len_undefined then List.nth undefined_list k else
List.nth list (k - len_undefined)

val name_of_num : 'a list -> 'a list -> int -> int -> 'a

但我的问题是,当我应用到我的函数时,列表的类型与未定义列表不同。所以这个函数不能通过编译器。其中 undefined 是一个字符串列表。

let len_undefined xsds = List.length (undefined xsds)

let xsds_of_int xsds =
List.map (List.map (name_of_num xsds undefined (len_undefined xsds)))

xsds类型为 xsds在我的程序中。如果我更换 undefinedxsds喜欢这个功能:

let xsds_of_int xsds =
List.map (List.map (name_of_num xsds xsds (len_undefined xsds)))

它有效。 k < len_undefined 时如何写第二个条件?

let name_of_num list len_undefined k =
if k < len_undefined then ??? else
List.nth list (k - len_undefined)

谢谢。

最佳答案

您所要求的似乎是不可能的。您想要提供两个不同类型的列表。但是您的函数有时会返回 list 的元素,有时会返回 undefined_list 的元素。由于 OCaml 是一种强类型语言,因此函数必须始终返回相同类型的值。因此 listundefined_list 必须具有相同的类型。

在不了解您的要求的情况下,很难知道要提出什么建议。但是,定义一个 类型以组合您喜欢的任意两种类型非常容易。 (或任何有限数量的类型。)

type either = A of typea | B of typeb

值(A x) 表示typea 的值,值(B y) 表示typeb 的值。但是这两个值是相同的类型,类型either

然后您将定义 name_of_num 以获取两个不同类型的列表,但它会返回 either 类型。如果你想更有趣,你可以将 either 定义为参数化类型,这将允许 name_of_num 是多态的。这是否是一件好事取决于您要解决的问题。

我不确定这是否能解决您的问题,但希望对您有所帮助。

编辑

如果您使用 either 类型,您的函数将如下所示。患病的对一种类型使用 int,对另一种类型使用 string

type either = A of int | B of string

let name_of_num list undefined_list len_undefined k =
if k < len_undefined then
(B (List.nth undefined_list k))
else
(A (List.nth list (k - len_undefined)))

val name_of_num : int list -> string list -> int -> int -> either = <fun>
#

编辑2

我突然想到您可能想使用异常来解决您的问题。如果您正在尝试填充映射值矩阵,并且超出范围的输入很少见(并且指示错误),您可以在看到错误输入时引发异常。调用者可以捕获异常并决定做什么。那么您的 name_of_num 函数将始终返回 xsd。 (如果它看到一个错误的值,它根本不会返回。)

关于ocaml - 从位置到元素的函数转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9355565/

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