Вопрос

Я пытаюсь разработать простую среднюю функцию в 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top