Wyobraź sobie, że musisz złożyć sekwencję i chcesz poznać również wartości pośrednie w kilku punktach wzdłuż tego zakresu. To właśnie użyłem do tego:Jaki jest ten wzór składania i iteracji?
[a,b,c] = map fst . tail $ chain [g i, g j, g k] (zero, sequence)
g :: Integer -> (a,b) -> (a,b)
chain (f:fs) x = x : chain fs (f x)
chain [] x = [x]
Funkcja g
zużywa określoną część sekwencji wejściowej (długości i
, j
, etc.), począwszy od początkowych wartości i produkujących takie same wyniki typ, który zostanie wprowadzony do następnej inwokacji. Zużywanie sekwencji kilkukrotnie dla różnych długości, począwszy od początku i tej samej wartości początkowej, byłoby nieefektywne, zarówno w czasie, jak i w przestrzeni.
Tak więc z jednej strony składamy tę sekwencję liczb całkowitych - punkty pośrednie w sekwencji; z drugiej strony, iterujemy tę funkcję, g
. Co to jest? Czy tu brakuje czegoś podstawowego? Czy można to w jakiś sposób wyrazić za pomocą regularnego repertuaru fałd itp.?
EDIT: Rozwiązany: powyższe jest po prostu
[a,b,c] = map fst . tail $ scanl (flip g) (zero, sequence) [i, j, k]
ciekawy jak modyfikowalne iteracja faktycznie jest składane na liście modyfikatorów.
Czy w zasadzie oznaczasz skaner? http://www.haskell.org/hoogle/?hoogle=scanl – Marcin
@Marcin ah, tak, podstawowe rzeczy. Prawdopodobnie tak. Tym, co mnie zmyliło, było to, że samo "g" również składa się na sekwencję. Domyślam się, że funkcja skanowania łączyłaby '(zero, sekwencja)' z 'i' i skanowała bezpośrednio' [i, j, k] '... Dzięki, spróbuje! –