Я пытаюсь определить примитивную рекурсию в терминах foldr
, как объясняется в A tutorial on the universality and expressiveness on fold глава 4.1.Строгость сопоставления шаблонов против деконструирования
Вот первая попытка у него
simpleRecursive f v xs = fst $ foldr g (v,[]) xs
where
g x (acc, xs) = (f x xs acc,x:xs)
Однако приведенное выше определение не останавливается на head $ simpleRecursive (\x xs acc -> x:xs) [] [1..]
Ниже определение, что остановить
simpleRecursive f v xs = fst $ foldr g (v,[]) xs
where
g x r = let (acc,xs) = r
in (f x xs acc,x:xs)
Учитывая почти аналогичное определение, но другой результат, почему он отличается? Это связано с тем, как шаблон Haskell соответствует?
Вероятно, связано с вопросом обзорного с 'xs', так как перемещение его в определении' G' исправляет эту проблему. – chepner