打印 F# 元组列表

3

我有一些代码需要测试,它应该将两个相同长度的整数列表合并为元组列表。我已经编译成功,但是我无法确定它是否有效,因为我在打印结果时遇到了问题。

这是我目前的代码:

    let myList = [5;15;20;25;30;200]
    let myList2 = [6;16;21;26;31;201]

    let rec tupleMaker (list1: int list) (list2: int list) =
        match list1, list2 with
        | (h1 :: tail1),(h2 :: tail2)->
          let (a,b) = (h1,h2)
          (a,b) :: tupleMaker tail1 tail2
        | _,_->
          []

    let z = tupleMaker myList, myList2
    //printfn z
    //printfn %A
printfn不起作用,我尝试了其他方法也没用,非常需要帮助。

5
你的解决方案中在两种情况下都只提供了一个参数,而 printfn 需要两个参数。尝试同时提供格式化字符串和相应格式的数据,如 printfn "%A" z。另外,在 z 的定义中,你函数应用的语法错误,我认为你想消除 myListmyList2 之间的逗号。 - Honza Brestan
哎呀,太感谢了,似乎现在可以工作了! - SBugryn
2个回答

5

注意:OP已经好几个月没露面了,所以这个答案可能永远不会被采纳。但是请不要因此认为它不正确。

首先生成一个元组列表。
这使用了两种不同类型的列表,使得答案在一般情况下更加有用。

let myList: int list = [1;2;3]
let myList2 : string list = ["a";"b";"c"]

let listOfTuple:(int * string) list = List.zip myList myList2 

有许多方法可以打印元组列表,但基本思路是使用List.iter访问列表中的单个元组,然后应用标准方法访问元组中的项。
示例1:
此示例未使用List.iter。 它仅使用printfn %A。 当您被困在尝试弄清楚为什么某些内容无法打印并且只需要看到系统查看数据时,这很有用。
 printfn "%A" listOfTuple

结果:

[(1, "a"); (2, "b"); (3, "c")]

例子 2:

这里使用 List.iterprintfn %A。当你知道数据是一个列表但不知道各个项的类型时这很有用。

listOfTuple |> 
    List.iter (printfn "%A")

结果:

(1, "a")
(2, "b")
(3, "c")

示例3:

这里使用List.iter和元组解构器,例如let (a,b) = values,来获取元组中每个值。如果您想要打印列表中每个项目的每个值,则此方法很有用。

listOfTuple |> 
    List.iter(
        fun values -> 
            let (a,b) = values
            printfn ("%i, %s") a b
    )

结果:

1, a
2, b
3, c

示例4:

这里使用了带有match语句的List.iter来获取元组中的各个值。如果您想进行更复杂的处理,例如在打印之前进行过滤,或者针对不同的值有不同的打印信息和/或格式,那么这种方法就非常有用。

listOfTuple |>
    List.iter( 
        fun values ->
            match values with
            | (a,_) when a > 1 -> 
                printfn ("%i") a
            | (_,_) -> ()
    )

结果

2
3

4
你刚刚实现了 List.zip
List.zip myList myList2    
//val it : (int * int) list =
//  [(5, 6); (15, 16); (20, 21); (25, 26); (30, 31); (200, 201)]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接