2017-11-25 5 views
0

어떻게 내가 지금 그것의 목록을 얻을 수 Generator느릅 나무 발전기 지능 -> 목록 지능

intList : Generator (List Int) 
intList = 
    list 5 (int 0 100) 

에서 List을 얻으려면?

+1

5 개의 난수 목록을 반환하는 함수가 순수하지 않을 수는 없습니다. 당신이 성취하고자하는 것에 대해 더 많이 말할 수 있습니까? 그리고 우리는 관용적 접근법을 찾을 수 있도록 도울 수 있습니다. –

답변

4

Elm 함수가 항상 순수하기 때문에 Generator에서 임의의 목록을 가져올 수 없습니다. 목록을 얻는 유일한 방법은 명령을 사용하는 것입니다.

명령은 불완전한 작업을 수행하도록 Elm 런타임에 지시하는 방법입니다. 귀하의 경우에는 임의의 정수 목록을 생성하도록 지정할 수 있습니다. 그런 다음 해당 작업의 결과를 update 함수의 인수로 반환합니다. 당신이 함수 a -> msg를 제공 할 필요가 있으므로,

generate : (a -> msg) -> Generator a -> Cmd msg 

이미 Generator a (당신의 intList)가 :

당신은 기능 Random.generate를 사용하여, 임의의 값을 생성 느릅 나무 런타임에게 명령을 전송합니다. 이 함수는 a (귀하의 경우 List Int)을 메시지으로 바꿔야합니다.

type Msg = 
    RandomListMsg (List Int) 
    | ... other types of messages here 

update : Msg -> Model -> (Model, Cmd Msg) 
update msg model = case msg of 
    ... -> (model, Random.generate RandomListMsg intList) 
    RandomListMsg yourRandomList -> ... 

아직 약 메시지모델를 모르는 경우, 당신은 아마도 Elm architecture 처음에 익숙해해야합니다

마지막 코드는 그런 일해야한다.

+0

이렇게 끝내게되었습니다. 그러나 왜 목록을 반환 할'Random.generate intList'를 실행할 수 없었는지 이해할 수 없습니다. 어떻게 이것이 순수 함수 개념을 깨뜨릴 수 있습니까? –

+1

@MihkelL. 순수 함수는 항상 같은 값을 반환해야합니다. 함수는 매번 다른 목록을 반환하므로 순수할 수 없습니다. – ZhekaKozlov

2

Random.step에 고유 한 시드 값을 제공 할 수 있습니다.이 값은 목록과 다음 시드 값이 포함 된 튜플을 반환합니다. 동일한 씨앗을 통과 할 때 항상 동일한 결과를 얻으므로 순도를 유지합니다. @ZhekaKozlov에 의해 주어진

Random.step intList (Random.initialSeed 123) 
    |> Tuple.first 

-- will always yield [69,0,6,93,2] 

대답은 당신이 응용 프로그램의 임의 값을 생성하는 방법을 일반적이지만, 초기 시드로 사용 된 현재 시간과 후드 Random.step를 사용합니다.

+0

이 예제가 실제 질문에 더 잘 응답한다고 생각합니다. 그러나 다른 대답은 아마도 "모범 사례"를 더 많이 보여줄 것입니다. 이 답변을 주셔서 감사합니다;) –