Почему я не могу сделать (flip (+). DigitToInt) $ '4' 4 - PullRequest
6 голосов
/ 19 октября 2010

Мне просто интересно, как $ работает: я ожидал

> (flip (+).digitToInt) $ '4' 4

<interactive>:1:24:
    Couldn't match expected type `t -> Char'
           against inferred type `Char'
    In the second argument of `($)', namely '4' 4
    In the expression: (flip (+) . digitToInt) $ '4' 4
    In the definition of `it': it = (flip (+) . digitToInt) $ '4' 4

, чтобы применить (flip (+).digitToInt) к 4 4, однако это не сработало. Как так? Я нашел это работает

>  (flip (+).digitToInt) '4' 4
8
it :: Int

И, я вижу тип:

>  :t (flip (+).digitToInt)
(flip (+).digitToInt) :: Char -> Int -> Int

Но я не понимаю, почему я не могу вызвать apply (flip (+).digitToInt) явно

Эта путаница проистекает из основного наблюдения, что

digitToInt $ '5'

и

digitToInt '5'

разрешено с тем же эффектом - за исключением того, что на вершине чуть больше линейного шума.

1 Ответ

15 голосов
/ 19 октября 2010
(flip (+).digitToInt) $ '4' 4

совпадает с

(flip (+).digitToInt) $ ('4' 4)

Что, конечно, не работает, потому что '4' не является функцией.

Чтобы получить желаемое поведение, вы можете сделать

(flip (+).digitToInt $ '4') 4

Или просто

(flip (+).digitToInt) '4' 4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...