1

SOに関するこの質問の後で、F#で2つのLazyListをマージしようとしています。もともと2つのリストを一致させるために書かれました。これを取得するためにそれを変更しました:

let rec printLazyList (l1:LazyList<int>) (l2:LazyList<int>) =
    match (l1, l2) with
        | t, s when t |> LazyList.isEmpty && s |> LazyList.isEmpty -> printfn "";
        | t , LazyList.Cons(h2,t2) when t |> LazyList.isEmpty -> printf "%d " h2 
                                                                 let a = LazyList.empty 
                                                                 printLazyList a t2
        | LazyList.Cons(h1,t1), s when s |> LazyList.isEmpty -> printf "%d " h1 
                                                                let b = LazyList.empty 
                                                                printLazyList t1 b
        | LazyList.Cons(h1,t1), LazyList.Cons(h2,t2) -> if h1 = h2 then 
                                                            printf "%d " h1 
                                                            printLazyList t1 t2 
                                                        elif h1 < h2 then 
                                                            printf "%d " h1  
                                                            printLazyList t1 l2
                                                        else 
                                                            printf "%d " h2  
                                                            printLazyList l1 t2

問題は、出力がないことです。いずれの条件も満たされていません(パターンマッチングの最後にaを付けることでこれを確認します。LazyListで使用されるものと通常のF#リストで使用される|_,_ printfn "nothing matches"ものに根本的な違いはありますか?これは通常のリストで機能したためです(cf.上記のリンク)。cons::

これも本当にn00bの質問である場合は申し訳ありません。FPはこの時点でかなり難しいように見えます。

4

1 に答える 1

5

を使用して機能をテストする場合は、コンソールに多くのノイズがあり、目が出力の行をスキップする可能性fsiがあるため、注意してください。fsi

これが完全なテストです(読みやすさのためにパターンマッチングのNil代わりにを使用して再編成することでいくつかのクリーンアップを行いました):isEmpty

#r "FSharp.PowerPack.dll"

open LazyList

let rec printLazyList l1 l2 =
    match l1, l2 with
    | Nil, Nil -> printfn ""
    | Nil, Cons(h2, t2) -> 
        printf "%d " h2 
        printLazyList LazyList.empty t2
    | Cons(h1, t1), Nil -> 
        printf "%d " h1 
        printLazyList t1 LazyList.empty
    | Cons(h1, t1), Cons(h2, t2) when h1 = h2 ->
        printf "%d " h1 
        printLazyList t1 t2 
    | Cons(h1, t1), Cons(h2, t2) when h1 < h2 ->
        printf "%d " h1  
        printLazyList t1 l2
    | Cons(h1, t1), Cons(h2, t2) ->
        printf "%d " h2  
        printLazyList l1 t2

let x = LazyList.ofList [1; 2];;
let y = LazyList.ofList [3; 4];;
printLazyList x y;;
于 2012-06-26T13:52:15.717 に答える