Size: a a a

2021 February 19

к

кана in Haskell Start
рекурсия тут есть, в самом определении fix
источник

D

Dmitry in Haskell Start
так а почему она конечная тогда
источник

D

Dmitry in Haskell Start
f применяет fix f который применяет fix f
источник

D

Dmitry in Haskell Start
блин - не вижу выхода
источник

к

кана in Haskell Start
она и не конечная, просто сама функция f из fix f можно не использовать аргумент
источник

D

Dmitry in Haskell Start
а, погоди - там пропал аргумент с двух сторон, да?
источник

к

кана in Haskell Start
fix (\_ -> 0)

вернет 0, не вычисляя свой аргумент (который бесконечный)
источник

к

кана in Haskell Start
язык же ленивый, если не использовать значение (пусть оно и бесконечное), то оно и не будет вычисляться
источник

к

кана in Haskell Start
length1 x =
 case x of
   [] -> 0
   _:xs -> 1 + length1 xs

length2 = fix $ \len ->
 \x ->
   case x of
     [] -> 0
     _:xs -> 1 + len xs
источник

к

кана in Haskell Start
тут мы на ветке [] -> 0 не стали использовать дальше len, поэтому бесконечное значение из fix (\len -> ...) дальше уже не вычисляется
источник

D

Dmitry in Haskell Start
окей окей, до меня аккуратно доходит, спасибо
источник

к

кана in Haskell Start
f :: ([a] -> Int) -> ([a] -> Int)
f len x =
 case x of
   [] -> 0
   _:xs -> 1 + len xs

length2 :: [a] -> Int
length2 = fix f

вот тут с типами, больше понятно почему несколько аргументов в лямбде fix
источник

D

Dmitry in Haskell Start
да, спасибо, мне на самом деле по этой функции досаточно было понять что просто аргумент кикнули
источник

D

Dmitry in Haskell Start
кана
import Debug.Trace (traceShowId)

fib :: Int -> Integer
fib = \i -> cache !! i
 where
   cache = fmap (fib' . traceShowId) [0..]
   fib' 0 = 1
   fib' 1 = 1
   fib' n = cache !! (n - 2) + cache !! (n - 1)

main = print (fib 10)
-- 10
-- 9
-- 8
-- 7
-- 6
-- 5
-- 4
-- 3
-- 2
-- 1
-- 0
-- result: 89


вот то же самое без всяких фиксов и memoize
а скажи пожалуйста, ты здесь использовал fmap, потому что сложная функция внутри?
просто я вижу работу с листом
источник

к

кана in Haskell Start
можно и просто map
источник

к

кана in Haskell Start
map :: (a -> b) -> [a] -> [b]
map = fmap
источник

к

кана in Haskell Start
берется список [0, 1, ...]
и каждый элемент i превращается в fib' i
источник

к

кана in Haskell Start
получется бесконечный список из всех чисел фибоначчи
источник

к

кана in Haskell Start
но каждый элемент в списке не вычислен (как и вообще список), и только когда мы зарашиваем N-ый элемент списка, мы его вычисляем

то есть получается кэш, в котором уже есть все значения, но не вычисленные, а когда мы запрашиваем элемент, то вычисляем его
источник

D

Dmitry in Haskell Start
то есть кэш - это просто ленивая функция?
источник