2014-11-04 1 views
0

나는 int의 목록에서 번 호를 얻으려고하지만 연산자/피연산자 불일치 오류가 계속 발생하려고합니다. I 출력이 될 내가 가지고 기대하고 있습니다 foldrFOLDR (SML)을 사용하여 번갈아 가산

l = [1,3,5,7,9] 
foldr (op-) l 

완전히 이해하지 않다 느낌이

1 - 3 + 5 - 7 + 9 = 5 

편집 :

실제로 익명을 사용 하겠냐 고 묻습니다 기능 : foldr

따라서 예 :

l = [1,3,5,7,9] 
foldr (fn (x, y): => x - y) l 
같은 예상 출력과 함께

있지만 여전히 동일한 피연산자/운영자 불일치

+0

'foldr' 유형을 확인하십시오. – beroal

답변

3

foldr (뿐만 아니라 foldl) 초기 값을납니다.

foldr의 유형 'b 접이식 각 단계의 결과의 유형 (및 초기 "결과가"초기 값)이다 ('a * 'b -> 'b) -> 'b -> 'a list -> 'b이고; 'a은 목록에있는 요소의 유형입니다. 'a'b은 다를 수 있습니다. 결합 함수는 요소와 이전 결과를 가져와 새 결과를 반환합니다.

어쨌든 적절한 초기 값을 고려해야합니다. 그것은 무엇이어야 하는가? 나는 0이 할 것이라고 생각 : List.foldl 함수를 사용하여 솔루션을 다음과 같습니다.

foldr op- 0 l 
+0

OP가 익명의 함수를 사용해야 할 필요가 있다면'foldr (fn (x, y) => x - y) 0'이어야하지만 분명히'(op-)'가 더 좋습니다. –

+0

'0'은 무엇을합니까? – Delfino

+0

@Delfini : 'foldr'에 대한 설명서를 보거나 http://en.wikipedia.org/wiki/Fold_%28higher-order_function%29 – newacct

1

해결 방법은 다음과 같습니다.

fun altSum ls = if (List.foldl op+ 0 (map (fn x => 1) ls)) mod 2 = 0 
       then ~1 * (List.foldl (fn (x, y) => y - x) 0 ls) 
       else List.foldl (fn (x, y) => y - x) 0 ls 

이것이 작동하는 이유는 알 수 있습니다. here.