Оператор Haskell dot
Я пытаюсь создать простую среднюю функцию в 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
Ответы
Ответ 1
Вы сбиваетесь с помощью правил приоритета haskell для операторов, которые запутывают.
Когда вы пишете
x = fromIntegral.sum lst
Haskell видит это так же, как:
x = fromIntegral.(sum lst)
То, что вы хотели написать, было:
x = (fromIntegral.sum) lst
Ответ 2
.
(композиция) имеет более низкий приоритет, чем приложение-функция, поэтому
fromIntegral.sum lst
интерпретируется как
fromIntegral . (sum lst)
что неверно, так как sum lst
не является функцией.
Ответ 3
Я просто хотел добавить "$ на помощь!":
x = fromIntegral $ sum lst
y = fromIntegral $ length lst
Он имеет самый низкий приоритет, и он должен избегать слишком большого количества скобок. Обратите внимание, что в отличие от (.), Он не выполняет функцию композиции, он оценивает аргумент вправо и передает его функции слева. Тип говорит все:
($) :: (a -> b) -> a -> b
(.) :: (b -> c) -> (a -> b) -> a -> c