F#列表中的倒数第二项

时间:2016-10-19 15:59:18

标签: f#

这是我最初的想法,在被召唤之前没有任何问题;这到底有什么问题?

let SecLastItem myList=  
    List.rev myList
        |>printfn myList.[1]

我如何纠正这个问题?查找列表中倒数第二个项目的最佳方法是什么?

3 个答案:

答案 0 :(得分:6)

printfn要求格式为printfn "%A" arg

但还有更多,功能编程有利于不变性,因此List.rev返回新列表而不修改mylist
因此,在myList中打印第二个项目不会让第二个项目从开始到第二个项目(如果它存在,否则它会崩溃)

那就是说你应该把功能分开并记录/打印那些'更好的重用和可组合性。

// trySecLastItem : 'a list -> 'a option
let trySecLastItem = List.rev >> List.tryItem 2

// usage
printfn "%d" (trySecLastItem someList) // ex Some 42 or None

现在,当trySecLastItem返回一个选项时,您必须处理该问题(例如,使用defaultArg

// maybeSecLast : int option
let maybeSecLast = trySecLastItem someList
printfn "%d" (defaultArg maybeSecLast 42)

答案 1 :(得分:4)

您需要拥有printfn

的格式化程序
let SecLastItem myList=  
    let revList = List.rev myList
    printfn "%A" revList.[1]

答案 2 :(得分:4)

  

查找列表中倒数第二项的最佳方法是什么?

如果您不想反转列表,可以使用模式匹配并返回一个选项,如果列表不够长,可以使用倒数第二个项目'。像这样的东西。

let rec secondToLast ls = 
    match ls with 
    |   []              -> None
    |   h :: ht :: []   -> Some(h)
    |   h :: t          -> secondToLast t

进行测试
printfn "%A" (secondToLast [1; 2; 3; 4])