이 조금과 복잡함을하고, 그것을 당신이 결코 (구문 오류 및 f
의 "정의"한다)를 사용하지 않는 것으로 f
및 getlast
의 목적이 될 수 있는지 불분명하다.
당신은 당신이 getlast []
이 SOME []
및 getlast [1,2,3]
이 SOME [1,2,3]
입니다 것을 알 수 있습니다이 기능의 당신의 getlast
외부 (이것은 일반적으로 좋은 생각입니다) 테스트 경우; getlast y
은 y
에 상관없이 SOME y
입니다.
또한, List.filter func L
의 결과는 'a list
아닌 'a option
, 그래서 그것은 last
의 정의로서 매우 유용 아니다. 목록 xs
이러한 요소를 찾는
한 가지 방법은 명시 적으로 재귀를 사용하고 있습니다 :
- 경우
xs
가 비어 결과는 NONE
입니다.
xs
이 비어 있지 않은 경우 먼저 xs
의 꼬리에 "마지막 요소"가 있는지 확인하십시오.
그게 있다면 대답입니다.
는 func
이 xs
의 머리를 보유하고 다음
- 경우에, 그것은 당신의 대답하지가됩니다.
- 그렇지 않으면 결과는
NONE
입니다. ML이 번역 는
,이 같은 것을 볼 수 있습니다
fun last _ [] = NONE
| last f (x::xs) = case last f xs of
NONE => if f x then SOME x else NONE
| result => result
당신이 List.filter
를 사용하고 수동 재귀를 피하려면, 다음리스트의 마지막 요소가 있음에 유의 그 목록의 역의 첫 번째 요소 :
fun last f xs = case List.rev (List.filter f xs) of
[] => NONE
| y::ys => SOME y