В следующем фрагменте вы можете увидеть две мои функции сопоставления, которые я написал на Haskell. Для рекурсивного приложения я использовал круглые скобки в первом примере (collatz), чтобы получить правильный приоритет.
Поскольку я только что узнал о применении функции с помощью $, я попытался переписать функцию (collatz '), используя эту штуку.Однако я обнаружил следующую ошибку:
Не удалось сопоставить ожидаемый тип `[a] ' против предполагаемого типа `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]
Я был бы признателен, если бы кто-нибудь взглянул на него и сказал мне, что я делаю не так.