2013-10-07 3 views
6

Я пытаюсь определить мои определения функций функции Haskell. Я взял foldl функции с ее определением являетсяКак читать «Num (a -> b -> a) => a -> [b] -> a" определение

:t foldl 
foldl :: (a -> b -> a) -> a -> [b] -> a 

Теперь первый аргумент функции, так что если я прохожу его, вот что осталось:

:t foldl (+) 
foldl (+) :: Num b => b -> [b] -> b 

, которую я прочитал как «функция, которая принимает числовое значение и возвращает функцию, которая принимает массив ».

Теперь, первый аргумент действительно является функцией? Можно ли считать

foldl :: a -> b -> a -> a -> [b] -> a 

вместо этого?

Я попытался прохождения только один числовое значение, и вот что у меня есть:

foldl 4 :: Num (a -> b -> a) => a -> [b] -> a 

И вопрос .. Как вы это читаете? Я не понимаю, что у меня есть.

+1

нет, его невозможно прочитать. почему вы пытаетесь игнорировать круглые скобки? –

ответ

8

Первый аргумент является функцией и, следовательно, его нельзя считать следующим: foldl :: a -> b -> a -> a -> [b] -> a. Поскольку -> является правильным ассоциативным, что означает a -> b -> c является a -> (b -> c) и отличается от (a -> b) -> c

+0

Спасибо, gotcha, хотя я все равно хотел бы знать, как читать «Num (a -> b -> a) =>». – Alehar

+0

@Alehar Это аннотация типа. Вы случайно попадаете в Хаскелл через Скала? – itsbruce

+1

На самом деле это неприменимая вещь, и так получилось, потому что, как обрабатываются числовые литералы. если вы используете что-то вроде 'let a = 10', а затем попробуйте': t fold a', вы получите сообщение об ошибке – Ankur

1

«Num» стал замешан в это потому, что вы прошли (+) в foldl. Таким образом, вы создали функцию с подписью

foldl (+) :: Num b => b -> [b] -> b 

Что это функция, которая принимает числовой и список Числовые и возвращает числовое.

Num b => b 

делает не значит «Функция, которая возвращает числовой - это то, что это будет означать в ScalaNum b означает, что все экземпляры b в остальной части этой подписи являются Числовой Это как.. тип аннотаций делается в Haskell.

foldl :: (a -> b -> a) -> a -> [b] -> a 

Указывает функцию, которая принимает 3 аргумента (один из которых является функция) и возвращает значение того же типа в качестве второго аргумента. Пробежав подписи ...

  1. Первый аргумент - это функция, которая сама принимает два аргумента и возвращает значение того же типа, что и первый аргумент. В скобках показано, что это всего лишь один аргумент и функция - вещь в скобках - это ее сигнатура функции. Назовем эту функцию func
  2. Второй аргумент может быть любым, если он является тем же самым типом, что и первый аргумент, принятый func.
  3. Третий аргумент должен быть последовательностью одного и того же типа в качестве второго аргумента, принятого FUNC
  4. Результат должен быть того же типа, что и второй аргумент (и первого аргумента, принятого FUNC).

Это только ожидания foldl имеют аргументы. Мы видим a и b в сигнатуре, так как мы могут иметь разные типы в качестве первого и второго аргументов func, но a и b могут быть любого типа, включая оба типа того же типа. Но когда вы передаете функцию foldl, создавая новую функцию, которая применяет func к остальным аргументам, вы добавляете тип ожиданий любого func is. Поскольку вы передали числовую функцию, эта аннотация добавляется к результирующей сигнатуре. И так как + ожидает , оба аргумента являются числовыми, мы видим только одну переменную типа в подписи (только b, а не a и b).

+0

У меня нет проблем с этим. Проблема в том, что, хотя я понимаю, что Num a, Ord b => a -> b -> a означает «взять число, взять что-то, что вы можете сравнить, вернуть число», я не знаю, что Num (a -> b -> a) => a -> [b] -> a означает. Я вижу, что первый аргумент и возвращаемое значение имеют один и тот же тип, второй аргумент - массив. Но как вы читаете «Num (a -> b -> a) =>"? – Alehar

+1

А, я вижу. Вы создали нечто принципиально невозможное - Haskell ожидает, что вы предоставите функции типа Num. Удачи с этим. Хаскелл ждет, когда вы придумаете этот магический тип. Как только вы это сделаете, у вас есть функция, ожидающая, чтобы взять ее как вход;) – itsbruce

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