1

在关于 SO 的这个问题之后,试图在 F# 中合并两个 LazyLists 。最初是为了匹配两个列表而写的。修改后得到这个:

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

问题是它没有输出。不满足任何条件(通过|_,_ printfn "nothing matches"在模式匹配的末尾放置 a 来检查这一点。cons在 LazyList 中使用的 与::在通常的 F# 列表中使用的 有根本区别吗?因为这适用于普通列表(cf.上面的链接)。

对不起,如果这又是一个非常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 回答