2012-07-04 2 views
5

Одним из примеров из Learn You a Haskell является:Явное определение которой чистая функция использовать

pure (+) <*> Just 3 <*> Just 5

Он утверждает:

Таким образом, на первом, мы имеем pure (+), который Just (+)

Я предполагая, что Haskell использует вывод типа в функции <*>, чтобы определить, что функция pure на LHS будет той, которая является экземпляром класса Maybe класса типа Applicative (исходя из того, что мы используем Just 5 на RHS, а Just a Maybe).

Однако, есть ли когда-либо случай, когда у вас есть значение, которое вы хотели бы превратить в аппликативный functor, используя метод pure, но вы не будете использовать его сразу же через функцию <*>, и, таким образом, Haskell может Определите, какую функцию использовать pure? Если да, то как бы вы были в явном состоянии, какая функция pure использовать?

Или это тот случай, когда Haskell не будет пытаться определить, какие pure функции до результата функции pure не используется в определенном контексте (например, когда вы кормите его в <*> функции в некоторой точке)

+1

Это вопрос вывода типа. – dave4420

ответ

11

Вы бы дали ему аннотацию типа. Если вы его определения в качестве переменной, вы должны использовать тип верхнего уровня подписи: (. Это также работает в let и where статей)

foo :: Maybe (Integer -> Integer -> Integer) 
foo = pure (+) 

Или, если вы используете его в выражении , вы должны написать (pure (+) :: Maybe (Integer -> Integer -> Integer)).

Вы также можете получить соответствующую функцию pure, не применяя ее к аргументу. Так как мы имеем:

pure :: (Applicative f) => a -> f a 

... мы можем сказать, (pure :: a -> Maybe a) получить pure нужного типа. Но (pure :: a -> Maybe a) (+) более запутанным, чем pure (+) :: Maybe (Integer -> Integer -> Integer), поэтому последнее, вероятно, более полезно в целом.

Последнее предложение вашего вопроса верно, однако: вы можете назначить pure (+) переменной без сигнатуры типа и использовать ее позже на конкретном конкретном типе (например, Maybe (Integer -> Integer -> Integer)) без использования каких-либо аннотаций какого-либо типа , (Есть небольшое ограничение: если вы определяете его как переменную верхнего уровня без какой-либо подписи типа, вы можете использовать его только как один определенного типа, а не два в разных местах, из-за ... но вы, вероятно, не нужно беспокоиться об этом.)

+3

Заключительный абзац текста вопроса также верен: часто, если вы не можете решить, какой конкретный прикладной функтор использовать, вам также не нужно.Нет необходимости сразу выбирать конкретный тип, вы можете определить производный код, который перегружен в аппликативном функторе. – kosmikus

Смежные вопросы