我有这个功能
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
Run Code Online (Sandbox Code Playgroud)
但由于某种原因,该功能期望单元列表,而不是通用列表
类型'unit'与'char'类型不匹配
为什么会这样?
正如其他人已经指出的那样,你可能想用map而不是iter.这样可行,但实施起来并不是特别有效.以下是使用列表推导实现它的另一种方法:
let randomSelect list toget =
[ let arr = list |> Array.ofList
for _ in 1 .. toget do
yield arr.[rng.Next(arr.Length)] ]
Run Code Online (Sandbox Code Playgroud)
...也可以使用map函数编写,但我发现理解语法更具可读性:
let randomSelect list toget =
let arr = list |> Array.ofList
[ 1 .. toget ] |> List.map (fun _ -> arr.[rng.Next(arr.Length)] )
Run Code Online (Sandbox Code Playgroud)
为了避免索引问题,该函数首先将列表(作为参数给出)转换为数组.如果您需要使用更多元素,这将更有效.对于较少数量的元素,仅使用列表和索引List.nth应该没问题.
然后,片段生成一个正确长度的序列(使用1 .. toget),并为此输入序列中的每个元素生成一个新的随机元素.输入序列中的值不是必需的 - 它们只是用于生成一些序列.
| 归档时间: |
|
| 查看次数: |
670 次 |
| 最近记录: |