Оператор 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