Оператор Haskell dot.
-
26-09-2019 - |
Вопрос
Я пытаюсь разработать простую среднюю функцию в Haskell. Это, кажется, работает:
lst = [1, 3]
x = fromIntegral (sum lst)
y = fromIntegral(length lst)
z = x / y
Но почему не работает следующая версия?
lst = [1, 3]
x = fromIntegral.sum lst
y = fromIntegral.length lst
z = x / y
Решение
Вы спотыкаетесь от правил приоритетов Haskell для операторов, которые сбивают с толку.
Когда вы пишете
x = fromIntegral.sum lst
Haskell видит, что как такое же, как:
x = fromIntegral.(sum lst)
Что вы имели в виду, чтобы написать:
x = (fromIntegral.sum) lst
Другие советы
.
(состав) имеет более низкий уровень приоритета, чем приложение функции, так
fromIntegral.sum lst
интерпретируется как
fromIntegral . (sum lst)
что не так с тех пор sum lst
не функция.
Я просто хотел добавить "$ до спасения!":
x = fromIntegral $ sum lst
y = fromIntegral $ length lst
Он имеет самый низкий приоритет, и это там, чтобы избежать слишком многих уровней скобок. Обратите внимание, что в отличие от (.), Это не делает композицию функциональности, она оценивает аргумент справа и передает его на функцию слева. Тип говорит все это:
($) :: (a -> b) -> a -> b
(.) :: (b -> c) -> (a -> b) -> a -> c