2011-05-07 2 views
2

일치하지 않는F 번호의 반복하는 : 유형 '단위'형식 '문자'나는이 기능을 가지고

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'유형과 일치하지 않습니다.

왜 이런 일이 발생합니까?

답변

5

다른 사람이 이미 지적했듯이 대신 iter을 사용하려고합니다. 그렇게해도 효과적이지만 효율적으로 구현되지는 않습니다. 여기에 지능형리스트 사용하여 구현하는 또 다른 방법입니다 또한 map 기능을 사용하여 작성 될 수

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

는 ...,하지만 난 이해 구문이 더 읽기 찾기 :

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

하는 것은 방지하기 위해 인덱싱의 문제점으로, 함수는 먼저 목록 (인수로 주어진)을 배열로 변환합니다. 더 많은 수의 요소를 사용해야하는 경우보다 효율적입니다. 요소 수를 줄이려면 List.nth을 사용하여 목록 및 색인을 사용하는 것이 좋습니다.

그러면 코드 조각 (1 .. toget 사용)이 올바른 길이의 시퀀스를 생성하고이 입력 시퀀스의 모든 요소에 대해 새로운 무작위 요소를 생성합니다. 입력 시퀀스의 값은 필요하지 않습니다. 시작하기 위해 일부 시퀀스를 생성하는 데 사용됩니다.

3

List.iter 때문에 unit을 반환하는 함수 및 기능 listunit의 목록 경우에만, fun i -> primeGet i 반환 unit을 기대하고있다.

List.iterunit을 반환하고이 경우에는 존재하지 않는 함수의 부작용에만 사용되므로 코드가 컴파일 되었더라도 아무 것도 수행하지 않습니다. 내 생각 엔 아마도 mapiter 대신 사용하고 싶은데 그 결과가 primeGet 인 목록을 반환합니다. 이렇게하면 유형 오류가 수정됩니다.

0

한 의견 :

let getK l k = List.nth l k 
    let primeGet = getK list 

List.nth는 선형 작업입니다. F # List는 링크 된 목록이므로 위치 개념이 없습니다. 그리고 코드에서 primeGet이 루프에서 사용되면 코드의 실행 시간이 2 차로됩니다.

+0

전혀 효과가 없다는 것을 알고 있습니다. 하지만 난 그것을 일하고 싶어요 firstm 그럼 그것을 더 잘 만들 – Marcom

관련 문제