F #

2016-10-19 4 views
1

에있는 목록의 마지막 두 번째 이것은 처음 생각한 것이고 호출 될 때까지 아무런 문제도 없었습니다. 정확히 무엇이 잘못 되었습니까?F #

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

여기에서 문제를 어떻게 해결합니까? 목록의 두 번째 항목부터 마지막 ​​항목까지를 찾는 가장 좋은 방법은 무엇입니까?

+0

답변과

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

테스트는 당신이 당신의'printfn' 문제를 이해하는 데 도움이 될 것입니다 http://stackoverflow.com/questions/18551851/why-does-fs-printfn-work- with-literal-string-but-not-value-of-type-string을 사용합니다. 그러나 myList. [1]'이'string'이라고 가정하면 빠른 해결책은 아마도'printfn "% s"myList. [1]'입니다. – birryree

답변

4

당신은 printfn

let SecLastItem myList= 
    let revList = List.rev myList 
    printfn "%A" revList.[1] 
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) 
4

목록의 마지막 항목에 2를 찾을 수있는 가장 좋은 방법은 무엇입니까 ?

패턴 일치를 사용하고 목록의 길이가 '마지막 항목까지'에 충분하지 않은 경우 옵션을 반환 할 수 있습니다. 이 같은. 여기

printfn "%A" (secondToLast [1; 2; 3; 4])