В следующем фрагменте вы можете увидеть мои две функции collatz, которые я написал в Haskell. Для рекурсивного приложения я использовал круглые скобки в первом примере (collatz), чтобы получить правильный приоритет.
Как я только что изучил функциональное приложение с $, я попытался переписать функцию (collatz '), используя эту вещь. Однако я сталкиваюсь со следующей ошибкой:
Не удалось сопоставить ожидаемый тип `[a] ' против inferred type `a1 → [a1] 'Во втором аргументе` (:)', а именно `collatz '' В первом аргументе` ($) ', а именно `n: collatz '' В выражении: n: collatz '$ n `div` 2
collatz :: (Integral a) => a -> [a]
collatz 1 = [1]
collatz n | even n = n : collatz (n `div` 2)
| otherwise = n : collatz (n * 3 + 1)
collatz' :: (Integral a) => a -> [a]
collatz' 1 = [1]
collatz' n | even n = n : collatz' $ n `div` 2
| otherwise = n : collatz' $ n * 3 + 1
Мне показалось странным, что это не сработало. Поэтому я попробовал аналогичный пример:
True : [even $ 3 `div` 3]
Я был бы признателен, если бы кто-нибудь мог взглянуть на него и сказать мне, что я делаю неправильно.