에있는 목록의 마지막 두 번째 이것은 처음 생각한 것이고 호출 될 때까지 아무런 문제도 없었습니다. 정확히 무엇이 잘못 되었습니까?F #
let SecLastItem myList=
List.rev myList
|>printfn myList.[1]
여기에서 문제를 어떻게 해결합니까? 목록의 두 번째 항목부터 마지막 항목까지를 찾는 가장 좋은 방법은 무엇입니까?
에있는 목록의 마지막 두 번째 이것은 처음 생각한 것이고 호출 될 때까지 아무런 문제도 없었습니다. 정확히 무엇이 잘못 되었습니까?F #
let SecLastItem myList=
List.rev myList
|>printfn myList.[1]
여기에서 문제를 어떻게 해결합니까? 목록의 두 번째 항목부터 마지막 항목까지를 찾는 가장 좋은 방법은 무엇입니까?
당신은 printfn
let SecLastItem myList=
let revList = List.rev myList
printfn "%A" revList.[1]
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)
목록의 마지막 항목에 2를 찾을 수있는 가장 좋은 방법은 무엇입니까 ?
패턴 일치를 사용하고 목록의 길이가 '마지막 항목까지'에 충분하지 않은 경우 옵션을 반환 할 수 있습니다. 이 같은. 여기
printfn "%A" (secondToLast [1; 2; 3; 4])
답변과
테스트는 당신이 당신의'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