는 첫 단계로, 우리는 정의
outputList x y = concat . map ($ y) $ map ($ x) [getRow,getColumn,getBlock]
다음과 같이 함수의 합성 오퍼레이터 (.)
대신 함수 애플리케이션 ($)
연산자를 사용하여 재기록 될 수 있다는 것을 관찰한다.
outputList x y = (concat . map ($ y) . map ($ x)) [getRow,getColumn,getBlock]
다음으로 우리는 map
다른 이름이 목록에 fmap
위한 것이며 fmap
법칙을 만족하므로, 특히, 우리가 map (f . g) == map f . map g
을 알 수 있습니다. 우리는이 법을 적용하여 map
이라는 단일 응용 프로그램을 사용하여 버전을 정의합니다.
outputList x y = (concat . map (($ y) . ($ x))) [getRow,getColumn,getBlock]
최종 단계로서 우리 concatMap
의해 concat
map
과의 조성물을 대체 할 수있다.하스켈 프로그래머는 많은 공상 연산자를 사용하는 경향이 있지만
outputList x y = concatMap (($ y) . ($ x)) [getRow,getColumn,getBlock]
마지막으로, 내 의견으로는, 함수의 기능이 명확하게 표현으로
outputList x y = concatMap (\f -> f x y) [getRow,getColumn,getBlock]
에 의해 기능을 정의하는 수치가 아닙니다. 그러나 형식 클래스 추상화를 사용하면 (다른 대답에서 설명 된 것처럼) 문제가 특정 추상 구조를 가지며 새로운 통찰력을 얻는 것을 관찰 할 수 있으므로 좋은 방법이 될 수 있습니다.
그런데 하스켈에 관한 질문에 대한 답변이있을 때까지 얼마나 오랜 시간이 걸립니까? 나는 하스켈의 모든 질문 중 90 퍼센트가 거의 즉각적으로 대답된다고 생각합니다. 이 답변의 품질에 대해 아무 말도하지 않지만, 내 생각에 그들은 꽤 높은 품질을 가지고 있습니다. –
@JanChristiansen : 원하는 경우 스택 교환 데이터 탐색기를 사용하여 대답 할 수 있습니다. 나는 대략적인 근사치 (명백한 특이점 필터링, 자체 응답 무시, & c)를 수행했으며, 첫 번째 응답이 게시 될 때까지의 평균 (즉, 중앙값) 시간은 약 20 분이었습니다. –