Да, еще один вопрос со знаком доллара. Извините... (я воспользовался поиском!)
Мой преподаватель курса функционального программирования сказал нам, что знак доллара «как бы добавляет открывающую скобку, а затем закрывающую в конце» (это очень приблизительно описано здесь в более или менее том же образом). Так
fibs = 0 : 1 : zipWith (+) fibs $ tail fibs
должно быть эквивалентно
fibs = 0 : 1 : zipWith (+) fibs (tail fibs)
Ну, это не так. Второе компилируется нормально, первое выдает ошибку:
jkjj.hs:1:8:
Couldn't match expected type `[a1] -> [a1]' with actual type `[a0]'
The first argument of ($) takes one argument,
but its type `[a0]' has none
In the expression: 0 : 1 : zipWith (+) fibs $ tail fibs
In an equation for `fibs':
fibs = 0 : 1 : zipWith (+) fibs $ tail fibs
fibonacci.hs:1:16:
Couldn't match expected type `[a0]' with actual type `[a1] -> [a1]'
In the return type of a call of `zipWith'
Probable cause: `zipWith' is applied to too few arguments
In the second argument of `(:)', namely `zipWith (+) fibs'
In the second argument of `(:)', namely `1 : zipWith (+) fibs'
И, конечно же, поскольку $ — это функция, такие вещи, как:
fibs = 0 : 1 $ zipWith (+) fibs (tail fibs)
не сработает, так что, по крайней мере, объяснение, которое дал мой профессор, было чрезмерным упрощением. При написании этого поста я постарался расставить скобки так, чтобы ошибка была та же. Я получил:
fibs = (0 : 1 : zipWith (+) fibs) $ tail fibs
и
fibs = (0 : 1 : zipWith (+) fibs) (хвост fibs)
которые оба дали мне точно такое же сообщение об ошибке (за исключением номеров столбцов, конечно). Почему это? Является ли a b $ c d эквивалентом (ab) (c d), а не a b (c d)? Я думаю, что все это связано с приоритетом функций и/или ассоциативностью, но я не знаю специфики. Я не знаю, как вы можете увидеть, какой уровень приоритета имеет функция (кроме перебора множества комбинаций), и я также не могу найти его в Google.
Я надеюсь, что кто-то может помочь мне понять это!