f#iterating:类型'unit'与'char'类型不匹配

Mar*_*com 2 f# unit-type

我有这个功能

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'类型不匹配

为什么会这样?

Tom*_*cek 5

正如其他人已经指出的那样,你可能想用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),并为此输入序列中的每个元素生成一个新的随机元素.输入序列中的值不是必需的 - 它们只是用于生成一些序列.