这是我最初的想法,在被召唤之前没有任何问题;这到底有什么问题?
let SecLastItem myList=
List.rev myList
|>printfn myList.[1]
我如何纠正这个问题?查找列表中倒数第二个项目的最佳方法是什么?
答案 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])