Я аппликативный <$>
оператор более или менее разобрался, но я не могу понять, подпись я получаю на следующем примере:
ghci> let f x y z = x + y + z -- f::Num a => a -> a -> a -> a
ghci> f <$> Just 2 <*> Just 3 <*> Just 4
Just 9
Этот результат я понимаю, но при проверке следующих типов:
ghci> :t (<$> f)
(<$> f) :: Num a => ((a -> a -> a) -> b) -> a -> b --This makes no sense to me
Это подпись я понял бы, как: функция, которая принимает (a -> a- > a) -> b
функцию и a
в качестве параметров и возвращает b
. Согласно этой логике, я должен назвать это как:
(<$>f) f 4
, который приведет к Integer
. Очевидно, это неверно, так что вы можете помочь мне понять, как читать тип (<$> f)
?
Вы уверены, что вас не интересует тип '(f <$>)' вместо? Обратите внимание, что '(f <$>)' совпадает с '(<$>) f', то есть частичным применением' (<$>) 'к его первому аргументу, но' (<$> f) 'является частичным применением' (<$>) 'в свой * второй * аргумент. – kosmikus
Оператор '<$>' - это просто псевдоним для 'fmap' из класса« Functor ». Я согласен с @kosmikus, что вы, возможно, хотели попробовать ': t (f <$>)' или, возможно, ': t (<$>) f' (они эквивалентны). – bheklilr
Вы оба абсолютно правы, я искал '(f <$>)' !!! Но теперь мне остается удивляться, почему мои рассуждения не держатся, когда говорят о '(<$> f)', как читать его подпись? – Chirlo