gpt4 book ai didi

list - F# 是否有等同于 Haskell 的方法?

转载 作者:行者123 更新时间:2023-12-03 21:00:54 25 4
gpt4 key购买 nike

在 Haskell 中,有一个函数“take n list”,它从列表中返回前 n 个元素。例如“sum (take 3 xs)”对列表 xs 中的前三个元素求和。 F# 有等价物吗?我希望它是列表功能之一,但我找不到任何似乎匹配的东西。

最佳答案

为了澄清一些事情,Seq.take 之间的区别和 Seq.truncate (正如@sepp2k 所指出的)是第二个会给你一个序列,它最多返回你指定的元素数量(但如果序列的长度更短,它会给你更少的元素)。

生成的序列Seq.take如果您尝试访问超出原始列表长度的元素,函数将抛出异常(注意 Seq.take 函数不会立即抛出异常,因为结果是延迟生成的序列)。

此外,您不需要将列表显式转换为序列。在封面下,list<'a>是一个继承自 seq<'a> 的 .NET 类。 type,它是一个接口(interface)。类型seq<'a>实际上只是 IEnumerable<'a> 的类型别名,所以它由所有其他集合(包括数组、可变列表等)实现。以下代码可以正常工作:

let list = [ 1 .. 10 ]
let res = list |> Seq.take 5

但是,如果您想获得 list<int> 类型的结果您需要将序列转换回列表(因为列表比序列更具体):
let resList = res |> List.ofSeq

我不确定为什么 F# 库不提供 List.takeList.truncate .我想我们的目标是避免为所有类型的集合重新实现整个函数集,因此在使用更具体的集合类型时序列的实现足够好的那些函数仅在 Seq 中可用。模块(但这只是我的猜测......)

关于list - F# 是否有等同于 Haskell 的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2632833/

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