Haskell: приложение-функция с $

В следующем фрагменте вы можете увидеть две мои функции сопоставления, которые я написал на 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]

Я был бы признателен, если бы кто-нибудь взглянул на него и сказал мне, что я делаю не так.

11
задан Adam Wagner 4 December 2011 в 21:24
поделиться