2012-07-26 3 views
3

나는 F 번호에서이 하스켈을 어떻게해야합니까 :F destructuring 하스켈의 목록 # 버전

f acc (x:y:z:xs) = f (acc-x+y*z) xs 
f acc [] = acc 

I가 필요하기 때문에 알고리즘 임의 바로 중요한 점은 처음 3와 목록의 꼬리가 선택되어 있습니다 그들 모두와 꼬리를 사용하십시오.

반복적 인 헤드 호출을 사용하여 x # 및 y를 나타 내기 위해 반드시 # F로 작성해야합니까?

편집 : 이 기술이 공식적으로 haskell에서 호출 된 것과 다른 사람들의 향후 검색에 대한 질문 제목에 설명해 주시기 바랍니다. 나는 그것을 손에서 기억할 수 없습니다.

+1

그것은 _ 목록 구조화라고 불립니다. – Daniel

+1

보다 일반적으로 패턴 일치라고합니다. 이것은 단지 목록의 (중첩 된) 패턴 일뿐입니다. – Ben

답변

10

입니다 꼬리에 도달 할 때까지

let rec f acc (x::y::z::xs) = f(acc - x + y * z) xs 

하지만,이 기능은 항상 MatchFailureException로 끝납니다 조심하십시오 경기가 실패합니까? 당신은 아마도 이것을 원할 것입니다 :

let rec f acc = function 
    | x::y::z::xs -> f (acc-x+y*z) xs 
    | _ -> acc 
+0

예, 그 맛있는 점을 잊어 버렸습니다. 이봐. 감사! –

+0

물론 이것은 마지막 인수 만 해체해야하는 경우에만 작동합니다. – newacct

1

smth like this? 그것은 열심히 F를 평가하려고하기 때문에 당신이 때 패턴을 수행 할 일을 적은 것보다 3 개 요소