Я пытаюсь обернуть голову вокруг оператора приложения функции ($
) в Haskell.Попытка понять оператор приложения функции в Haskell
Я работаю с примерами в ЖЖ вас на Haskell, и я думал, что я понял, следующий пример:
Prelude> map ($ 3) [(+4), (*10), (^2), sqrt]
[7.0,30.0,9.0,1.7320508075688772]
Затем я попробовал следующий вариант, который также работал отлично:
Prelude> map ($ 3) [(+4), (*10), (\x -> x^2), sqrt]
[7.0,30.0,9.0,1.7320508075688772]
Наконец, я попытался модифицировать третью функцию в списке следующим образом, который генерирует сообщение об ошибке:
Prelude> map ($ 3) [(+4), (*10), (\x -> 2^x), sqrt]
<interactive>:53:38:
Ambiguous type variable `b0' in the constraints:
(Floating b0)
arising from a use of `sqrt' at <interactive>:53:38-41
(Integral b0) arising from a use of `^' at <interactive>:53:33
(Num b0) arising from the literal `3' at <interactive>:53:8
Probable fix: add a type signature that fixes these type variable(s)
In the expression: sqrt
In the second argument of `map', namely
`[(+ 4), (* 10), (\ x -> 2^x), sqrt]'
In the expression: map ($ 3) [(+ 4), (* 10), (\ x -> 2^x), sqrt]
Prelude>
Кажется, если конечная sqrt
функция как-то начать связан с предыдущим элементом списка, так как следующий вариант работает нормально:
Prelude> map ($ 3) [(+4), (*10), (\x -> 2^x)]
[7,30,8]
Может кто-нибудь просветить меня к тому, что здесь происходит?
один урок, чтобы извлечь из этого, попробовав что-то в приглашении GHCi, проверьте его * тип *, с ** 'Прелюдия>: t it' **. «Это» - специальное слово, относящееся к предыдущему результату, и ': t' просит посмотреть тип. Вы могли видеть, что в вашем последнем примере нет десятичных точек в числах. Кроме того, после ввода ** ': s + t' ** в приглашении GHCi сообщит тип для каждого полученного результата. –