gpt4 book ai didi

f# 迭代 : The type 'unit' does not match the type 'char'

转载 作者:行者123 更新时间:2023-12-05 01:09:27 25 4
gpt4 key购买 nike

我有这个功能

let items = ['a'; 'a'; 'a'; 'a'; 'b'; 'b'; 'a'; 'a'; 'c'; 'd'; 'd'; 'e'; 'e';] 

open System
let rng = new Random()

let randomSelect list toget = let randomList k len = List.init k (fun _ -> rng.Next(1,len))
let getK l k = List.nth l k
let primeGet = getK list
List.length list
|> randomList toget
|> List.iter (fun i -> primeGet i)

let res23 = randomSelect items 3

但出于某种原因,函数需要一个单元列表,而不是通用列表

类型“unit”与类型“char”不匹配

为什么会这样?

最佳答案

正如其他人已经指出的,您可能想使用 map 而不是 iter。那会起作用,但它不会是特别有效的实现。这是使用列表推导式实现它的另一种方法:

let randomSelect list toget = 
[ let arr = list |> Array.ofList
for _ in 1 .. toget do
yield arr.[rng.Next(arr.Length)] ]

...也可以使用 map 函数编写,但我发现理解语法更具可读性:

let randomSelect list toget = 
let arr = list |> Array.ofList
[ 1 .. toget ] |> List.map (fun _ -> arr.[rng.Next(arr.Length)] )

为避免索引问题,该函数首先将列表(作为参数给出)转换为数组。如果您需要获取更多元素,这将更有效。对于较少数量的元素,仅使用列表并使用 List.nth 进行索引应该没问题。

该代码片段然后生成一个正确长度的序列(使用 1 .. toget)并为该输入序列中的每个元素生成一个新的随机元素。输入序列中的值不是必需的 - 它们仅用于生成一些序列。

关于f# 迭代 : The type 'unit' does not match the type 'char' ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5921963/

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