사실, 우리는 다음의 두 가지 패턴을 수행 할 수
- [1,2,3,4, ...]가된다 [1,3,5,7 ...]
- [1,2,3,4 ..]는 모두 동일한 작업을 수행
] ... 2,4,6,8 [된다, 그러나 그들은 "계산을 시작" 반대로. 같은 기능으로 두 가지를 구현합시다! 물론이 함수는 "패턴"에 따라 매개 변수화되어야합니다. 가능한 두 가지 패턴이 존재하므로 매개 변수화를위한 유형에 대해 부울이 필요합니다. 구현 : "세마포어"우리가 "플래그"로 부울 매개 변수를 사용하자 : 우리는 "플래그/세마포어를"부기, 보조 기능을 사용한
module Alternation where
every_second :: [a] -> [a]
every_second = every_second_at False
every_second_at :: Bool -> [a] -> [a]
every_second_at _ [] = []
every_second_at True (x : xs) = x : every_second_at False xs
every_second_at False (x : xs) = every_second_at True xs
: 그것은 적절하게 교환합니다. 실제로이 보조 기능은 원래 작업의 일반화로 간주 될 수 있습니다. 제 생각에 그것은 "worker wrapper"기능입니다.
인덱스가있는 카운트 다운
작업을 더 일반화 할 수 있습니다. "modulus"m으로 매개 변수화 할 수있는 훨씬 더 일반적인 함수를 작성하지 말고 모두 m번째 개의 요소를 "수확"합니다.
- every_mth 1 [1,2,3,4, ...] 수율 [1,2,3,4 ...]
- every_mth 2 1,2,3,4 .. .] 수율 [1,3,5 ...]
- every_mth 3 [1,2,3,4, ...] 수율 [1,4,7 ...]
우리가 할 이전과 같은 아이디어를 사용하십시오. 더 복잡한 "세마포어"를 사용해야합니다 : 부울 대신 자연수. 이것은 "카운트 다운"매개 변수 인덱스입니다 나는 그것이 우리의 차례입니다 부기 :
module Cycle where
import Nat (Nat)
every_mth :: Nat -> [a] -> [a]
every_mth 0 = undefined
every_mth m @ (i + 1) = every_mth_at m i
우리는 보조 기능 (
worker wrapper)를 사용, 카운트 다운 인덱스
내가 부기 :
every_mth_at :: Nat -> Nat -> [a] -> [a]
every_mth_at _ _ [] = []
every_mth_at m 0 (x : xs) = x : every_mth m xs
every_nth_at m (i + 1) (x : xs) = every_mth_at m i xs
을
간단히하기 위해 자연수 형식은 단순한 별칭으로 여기에 "구현"되어 있습니다.
아마, 다수의 이론적 의미에서, 또한 사용자가 지정한 작업에 정확히 일치하지 청소기 대안 접근 방식이 있지만, 조정은 간단 것 같다 :
- 이
every_mth 1 [0,1,2,3,4,...]
수율 [0,1,2,3,4,...]
- 이
every_mth 2 [0,1,2,3,4,...]
수율 [0,2,4,6,8...]
을하자,
- 는
every_mth 3 [0,1,2,3,4,...]
그것은 "우연히"는 LIS를 제공해야합니다 있도록이 여기에 지정된 따라서 [0,3,6,9...]
를 얻을 수 있습니다 모든 자연수의 지연 목록에 적용될 때 매개 변수의 배수 t.
구현시 숫자를 "0부터 시작하는"색인으로 사용하는 것이 좋습니다. 대신에 "모든 m번째", 우리는 말할 "레인 징의 인덱스로 I를 사용하여 0, 1, ..., UU 상한을 나타내고 m -1 = , 가능한 지표.이 상단 지수는
module Multiple where
import Nat (Nat)
every_mth :: Nat -> [a] -> [a]
every_mth 0 = undefined
every_mth (u + 1) = countdown u
countdown :: Nat -> [a] -> [a]
countdown = countdown_at 0
countdown_at :: Nat -> Nat -> [a] -> [a]
countdown_at _ _ [] = []
countdown_at 0 u (x : xs) = x : countdown_at u u xs
countdown_at (i + 1) u (x : xs) = countdown_at i u xs
기타 문제를 대답했다. 인덱스 카운트 다운 보조 기능에 유용한 매개 변수가 될 수 있습니다, 그래서 더 일반적인 지점을 만들 수 있습니다. 당신은 명령 적 생각 : 먼저 목록의 길이를 찾은 다음 홀수 인 경우 첫 번째 요소를 가져온 다음 함수를 호출하여 나머지 요소를 가져옵니다. 목록을 만든 다음 요소를 앞에 놓습니다. 당신이해야 할 일은 표현과 방정식의 관점에서 생각하는 것입니다.원하는 결과는 목록의 첫 번째 항목 다음에 꼬리의 꼬리에 사실을 적용한 결과입니다. 그것을 하스켈로 번역하십시오. –