Haskell에서 작은 도구를 작성 한 경험이 있으며 특히 interact
표준 입력을 처리하고 표준 출력으로 파이프하는 필터를 작성하는 데 매우 직관적 입니다.
최근에 평소보다 약 10 배 큰 파일에 이러한 필터를 사용하려고 시도했는데 Stack space overflow
오류가 발생했습니다.
약간의 독서를 한 후에 (예를 들어 here 와 here ) 스택 공간을 절약하기위한 두 가지 지침을 확인했습니다 (경험이있는 Haskellers, 올바르지 않은 것을 쓰면 저를 정정하십시오).
- 꼬리 재귀가 아닌 재귀 함수 호출을 피하십시오 (꼬리 호출 최적화를 지원하는 모든 기능 언어에 유효).
- 소개
seq
표현들이 감소되기 전에 너무 큰 성장하지 않도록 하위 표현의 초기 평가를 강제로 (이 게으른 평가를 사용하여 언어에 하스켈 특정, 또는 적어도이다).
seq
내 코드에 5-6 번의 호출을 도입 한 후 툴이 원활하게 다시 실행됩니다 (더 큰 데이터에서도). 그러나 원래 코드는 조금 더 읽기 쉽습니다.
저는 숙련 된 Haskell 프로그래머가 아니기 때문에 seq
이런 방식으로 소개 하는 것이 일반적인 관행인지, seq
Haskell 프로덕션 코드에서 얼마나 자주 볼 수 있는지 묻고 싶었습니다 . 아니면 seq
너무 자주 사용하지 않고 스택 공간을 거의 사용 하지 않는 기술이 있습니까?
1
설명 한 종류와 같은 최적화는 거의 항상 코드를 조금 덜 우아하게 만듭니다.
—
Robert Harvey
@Robert Harvey : 스택 사용량을 낮게 유지하는 다른 기술이 있습니까? 내 기능을 다르게 다시 작성해야한다고 생각하지만 잘 확립 된 기술이 있는지 여부는 알 수 없습니다. 첫 번째 시도는 꼬리 재귀 함수를 사용하여 내 문제를 완전히 해결할 수는 없었습니다.
—
Giorgio