현재 다음과 같은 기능을 처리하고 있습니다.
foo = (\(a:b:c:d:e:f:_) -> foobar a b c d e f) . (++ repeat def)
다시 말해, 목록이 주어지면 처음 6 개의 요소를 무언가에 사용하고, 목록의 길이가 6 개 미만인 경우 def
누락 된 요소 의 독립형으로 사용 합니다. 이것은 합계이지만 그 조각은 (같은 map fromJust . filter isJust
) 아니므로 좋아하지 않습니다. 나는 부분을 사용할 필요가 없도록 이것을 다시 쓰려고 노력했다.
foo [] = foobar def def def def def def
foo [a] = foobar a def def def def def
foo [a,b] = foobar a b def def def def
foo [a,b,c] = foobar a b c def def def
foo [a,b,c,d] = foobar a b c d def def
foo [a,b,c,d,e] = foobar a b c d e def
foo (a:b:c:d:e:f:_) = foobar a b c d e f
기술적으로 내가 원하는 것을했지만 지금은 엄청난 혼란입니다. 더 우아하고 덜 반복적 인 방법으로 어떻게 할 수 있습니까?
case xs ++ repeat def of a:b:c:d:e:f:_ -> ...
그것을 사용하는 것과 기존의 대답이 소개하는 모든 여분의 기계를 건너 뛰는 것에 대해 두 번 생각하지 않을 정도로 총체 논쟁 은 충분히 국부적이라고 생각합니다. 일반적으로 긴장을 유발하는 것은 더 많은 총체적인 주장입니다 (예 : 여러 함수 호출에서 유지되는 불변량 포함).
takeWithDef
일치하는 패턴을 다음과 같이 패턴 화해야하기 때문에 실제로 는 정규 목록을 반환하면 사용할 수 없습니다. 올바른 해결책은 Daniel이 두 번째 답변에서 아래에 쓴 내용입니다. uncons
첫 번째 요소 만 가져 오므로 유용하지 않습니다.
uncons :: Default a => [a] -> (a,[a])
기본값을로 쓰십시오def
. 또는 기본값takeWithDef
입니다. 및 / 또는 뷰 패턴 / 패턴 동의어. 그래도 보조 도우미 코드를 작성해야합니다.