объявление константной функции в haskell

Меня смущает один конкретный пример функции const. Таким образом, объявление типа const :: a -> b->a указывает, что функция принимает два параметра типа a и b и возвращает тип a. Например:

const 5 3 => 5
const 1 2 => 1

Это имеет смысл на основе декларации. Однако я столкнулся с этим конкретным примером:

const (1+) 5 3 => 4

Это заставляет меня усомниться в моем понимании объявления функции. Я знаю, что эта функция принимает только два параметра, потому что я пытался:

const 1 5 3 

Теперь это убеждает меня, что он принимает только 2 параметра. Так как же это работает? Разве (1+) не является параметром? Если нет, то что это?

const (1+) 5 3 => 4

person Julian    schedule 04.03.2020    source источник
comment
Помните, что a может быть любого типа, а b игнорируется. Конкретным случаем может быть (a -> a -> a) -> b -> (a -> a -> a). b игнорируется, и возвращается функция a -> a -> a, ожидающая двух новых входных данных.   -  person JohEker    schedule 05.03.2020
comment
(1+) — это один параметр, но он также может принимать один параметр, что означает, что это функция. const возвращает его, и он вполне естественно принимает параметр (третий, 3 в вашем примере)   -  person Redu    schedule 05.03.2020


Ответы (1)


Я знаю, что эта функция принимает только два параметра ()

Каждая функция в Haskell принимает один параметр. Действительно, если написать:

 const 5  1

то это сокращение от:

(const 5) 1

Сигнатура типа const :: a -> b -> a является более компактной формой const :: a -> (b -> a).

Итак, const 5 создаст функцию, которая игнорирует параметр (здесь 1) и возвращает значение, которое ей было присвоено 5.

Теперь для const (1+) 5 3 таким образом означает, что мы написали:

((const (1+)) 5) 3

Таким образом, const (1+) создаст функцию, которая игнорирует параметр и возвращает (1+), поэтому const (1+) 5 равно (1+). Таким образом, мы вычисляем:

(1+) 3

который 4.

person Willem Van Onsem    schedule 04.03.2020