2013-12-11 3 views
1

다음 코드가 있습니다. Seq.mapignore 사이의 코드는 실행되지 않습니다. 두 printfn은 실행되지 않습니다. 왜? Seq.map의 코드가 실행되지 않았습니까?

는 I 기능 download에서
  • printfn "Downloading"
  • printfn "Downloaded"를 디버깅하는 시도
    1. links (이 전체 배관을 강조)

      중단 점을 설정.

    실행은 첫 번째 중단되지만 중단 점 2, 3은 결코 적중되지 않습니다. (또는 안으로 들어간다). 결과가 무시되기 때문에 F #은 Seq.map 부분을 최적화 했습니까?

    let download url = 
        printfn "Downloaded" 
        () // Will complete the function later. 
    
    let getLinks url = 
        .... 
        |> Seq.toList 
    
    let ..... 
        async { 
         ...... 
         links = getLinks url // Tried to modify getLinks to return a list instead of seq 
         ........ 
          links // execution hit this pipe (as a whole) 
          |> Seq.map (fun l -> 
           printfn "Downloading" // execution never hit here, tried links as Seq or List 
           download l) 
          |> ignore 
    

    는 업데이트 : 나는 for in do 일을 알고있다. 왜 Seq.map가 아닌가요?

  • +0

    ''seq '가 게으르기 때문에'seq '가 이전에 생성되지 않을 수 있습니다. 실행할 수있는 예제, 나는 단지 짐작하고있다. –

    +0

    링크를 목록으로 가져온 후 Visual Studio의 빠른보기를 사용하여 값을 볼 수 있습니다. – ca9163d9

    답변

    4

    요한이 말했듯이, seq 게으른이며, 당신이 실제로 순서 (대신 ignore 통해 폐기)를 통과하지 않기 때문에, 당신은 Seq.map에 전달 람다의 코드가 실행되지 않습니다. ignoreSeq.iter ignore으로 변경하면 시퀀스를 탐색하여 원하는 결과를 볼 수 있습니다. (시퀀스를 반드시 통과해야하는 함수는 모두 가능합니다. 예 : Seq.count |> ignore)

    +0

    내 질문을 업데이트했습니다. 'getLinks'의 끝에'|> Seq.toList'를 추가하려고했습니다. – ca9163d9

    +0

    @ dc7a9163d9 : 귀하의 편집은 문제를 해결하지 못합니다 - 당신은 여전히 ​​그것을 통과하는 대신 Seq.map의 결과를 버리고 있습니다. – ildjarn

    +0

    'Seq.toList'가 그것을 통과 할 것이라고 생각 했습니까? C에서는'.ToList()'가 목적으로 사용됩니다. 그것은 F #에서 다른가요? – ca9163d9

    관련 문제