дот имеет подпись:
(.) :: (b -> c) -> (a -> b) -> a -> c
здесь используется оператор инфикс. Так, в своем первом заявлении вы на самом деле написано:
dotEx1 = (.) (map (+3)) (filter (>100))
И это имеет смысл, так как filter (>100)
имеет подпись: (Num n,Ord n) => [n] -> [n]
и map (+3)
имеет подпись Num n => [n] -> [n]
. Однако, если вы пишете:
dotEx1 xs = (.) (map (+3)) (filter (>100) xs)
затем filter (>100) xs
имеет подпись (Num n,Ord n) => [n]
и поэтому это значение (не функция, или, возможно, функция без аргументов). Таким образом, оператор точки не может использоваться (типы не совпадают).
неформально оператор точка должна быть предоставлена две функции f
и g
и генерирует функцию, где f
применяется послеg
применяется на входе. Но g
, таким образом, должна быть функцией, принимающей один аргумент.
Из-за оператора точки? –
Я чувствую, что существующие ответы на самом деле не касаются вашего вопроса: они говорят «как это исправить», но не «почему это неправильно». Ответ одного предложения на эту часть довольно прост: функциональное приложение имеет более высокий приоритет, чем любой инфиксный оператор, включая '(.)'. (На самом деле я не думаю, что это одно предложение добавляет достаточно ценности, чтобы гарантировать еще один ответ). –