Подтвердить что ты не робот

Const Функция в Haskell

Функция

const определена в Prelude как:

const x _ = x

В ghci, когда я попытался

Prelude> const 6 5  -> Gives 6

Но когда я попробовал

Prelude> const id 6 5 -> Gives 5

Даже при внесении изменений, например

Prelude> (const id 6) 5 -> Gives 5

Если эта функция не дает 6 как вывод, поскольку функция id имеет тип id :: a -> a, и это должно связываться как

Prelude> (const 6) 5 -> Gives 6

Почему функция const работает по-другому?

4b9b3361

Ответ 1

Кажется, вы думаете, что это эквивалентно const (id 6) 5, где id 6 оценивается как 6, но это не так. Без этих круглых скобок вы передаете функцию id в качестве первого аргумента в const. Поэтому снова рассмотрите определение const:

const x _ = x

Это означает, что const id 6 = id. Следовательно, const id 6 5 эквивалентно id 5, что действительно 5.

Ответ 2

Функции

также могут быть параметрами других функций. id становится параметром const так что действительно выражение (const id 6) 5:

(const id 6) 5

(const id _) 5 - захватить первый параметр id

id 5

5

для более подробной информации о том, что действительно делают операторы

  • что-либо в паре скобок будет рассматриваться как целое выражение (но это не значит, что оно будет вычислено первым). например: (карта (1+)), (\ x → (-) x)

    Операторы префикса
  • имеют более предварительные операции, чем операции инфикса

  • самый левый префикс operatior в выражении будет рассматриваться как функция, которая захватывает параметры (включая другие операторы префикса) в выражении слева направо до тех пор, пока не появятся операторы infix или конец строки. например, если вы наберете map (+) id 3 const + 2 в ghci, вы получите сообщение об ошибке "Функция" карта "применяется к четырем аргументам...", поскольку map захватывает (+), id, 3 и const как параметры перед оператором infix +

Ответ 3

Чак прав, приложение функции в Haskell левое ассоциативное, что означает что вызов функции, такой как f a b c, эквивалентен (((f a) b) c). Помните, что в Haskell вы всегда должны практиковаться в отношении типов функций и пытаться сделать вывод о том, что функция может и не может сделать на основе своего типа. Сначала вы можете не вывести ничего из типа функции, но с большей информацией о типе опыта станет незаменимым.

Каков тип const? Введите :t const в GHCi. Он вернет const :: a -> b -> a. a и b являются переменными типа , что означает, что const примет аргумент любого типа. Поскольку аргументы 1 st и 2 nd имеют разные типы, вы можете передать практически все функции:

const 1 2 -- returns 1
const 'a' 1 -- returns 'a'
const [1,2,3] "a" -- returns [1,2,3]

Возможно, были специальные ограничения типов типов в переменных типа const, которые предотвратили бы передачу функций, таких как Num или Ord, потому что функция не является экземпляром этих типов. Другими словами, функция не ведет себя как число или упорядоченная вещь, поэтому f + g или f < g не имеет смысла. Но const не имеет ограничений типа стека, которые помешали бы нам передавать функции в качестве аргументов. Помните, что Haskell поддерживает функции более высокого порядка? Это означает, что функции Haskell могут принимать и возвращать другие функции. Поэтому:

const (+) (*) -- returns (+)
const head tail -- returns head
const id 2 -- returns id

const просто игнорирует аргумент 2 nd и возвращает все, что было передано в качестве аргумента 1 st будь то Char, String, Integer, Maybe, [], некоторый очень сложный тип алгебраических данных или даже функция.

Если тип const равен a -> b -> a, можете ли вы угадать тип const 'a', не обнаружив его без ввода :t const 'a' в GHCi? Чтобы узнать тип const 'a', замените тип аргумента 1 st вместо всех переменных того же типа, затем удалите первый аргумент из этого типа.

  • a -> b -> a: оригинальный тип
  • Char -> b -> Char: замените новый тип на переменные типа a
  • b -> Char: тип новой функции, удалив 1-й аргумент из объявления типа

Каков тип const id, тогда?

  • a -> b -> a: оригинальный тип
  • (a -> a) -> b -> (a -> a): подстановка
  • b -> (a -> a): результирующий тип (первый аргумент удален)
  • b -> a -> a: то же, что и выше, оператор -> право-ассоциативный

Упражнение:

  • Попытайтесь найти умственно или ручку и бумагу, не используя GHCi, каковы типы: const (+), const head, const tail, const (++), const map
  • Попробуйте выяснить, какие аргументы вы перейдете к вышеуказанным функциям, чтобы получить конкретное значение.