2014-10-24 2 views
0

는이 목록에서 최대 INT를 찾을 수있는 간단한 기능이지만, 나는 옵션이 작동하는 방법에 의해 혼란 스러워요 :옵션은 어떻게 작동합니까?

(* fn : int list -> int option *) 
fun max1 (xs : int list) = 
    if null xs then NONE 
    else 
     let val tl_ans = max1 (tl xs) 
     in 
      if isSome tl_ans andalso valOf tl_ans > hd xs 
      then tl_ans 
      else SOME (hd xs) 
     end 

그것은 "옵션"ML을 사용하고,하지만 난 방법을 모른다 . 첫 번째 NONE 사용은 간단하지만 나중에 과 함께 사용하면valOf이 아무데도 나오지 않는 것 같습니다. 나는 종류의 일부이 유형에을 (의 HD XS)를 가하고 이해하지만이

if isSome tl_ans andalso valOf tl_ans > hd xs 

가 작동 어떻게 헤아릴 수 없습니다.

답변

1

tl_ans은 을 tl xs에 적용한 결과로 정의 되었기 때문에 int option 유형을 갖습니다. isSome tl_anstrue 경우, 그 tl_ans = SOME (valOf tl_ans)을 의미한다, 그래서 우리는 함께 tl_ans에서 SOME -wrapped 값을 얻을 수 있습니다 valOf (그러나 다시, 우리는 이미 우리가 isSome 전화가 필요한 이유이다 이는 SOME, 알고 경우에만).

fun max1 (xs : int list) = 
    case xs 
    of [] => NONE 
     | x::rest => case max1 rest 
        of NONE => SOME x 
        | SOME max => if maxRest > x then SOME maxRest else SOME x 

이런 식 작성에 대한 깔끔한 것은,이에 대한 여지가 없다는 것입니다 :

것을 쓰기 훨씬 깨끗한 방법은 목록과 option 값을 모두 패턴 매칭을 사용하는 것입니다 isSome을 먼저 확인하지 않고 valOf을 사용하는 오류의 종류를 사용할 수 있습니다.

+0

감사합니다. 말이된다. 마침내 내 혼란은 let 바인딩에서 발생하는 재귀에서 발생한다는 것을 알게되었습니다. val tl_ans = max1 (tl xs). 나는 let의 몸보다 우선하는 재귀를 제대로 보지 못했습니다. 그 이해가 없으면 어떻게 tl_ans가 유형 옵션이되었는지 궁금해하고있었습니다. – 147pm

관련 문제