Я новичок в Haskell и имею проблему с функциями функций в Haskell. Значения функции в Haskell, правильно? (+3) 3 = 6, но что означает (+3) (+3). Принимает ли (+3) значение?Haskell: функции и значения
ответ
(+3) (+3)
- это просто ошибка типа и, следовательно, он не будет компилироваться.
Тип (+3)
является Int -> Int
, что означает, что при применении Int
, мы получим еще Int
. Это также означает, что можно применять только значения типа Int
!
Таким образом, вы не можете применить к (+3)
значение типа Int -> Int
, только значения типа Int
.
Так что да, (+3)
- это значение, но не правильного типа, чтобы применить его к функции, ожидающей значения типа Int
.
Int
не могут быть объединены с Int -> Int
, потому что они имеют разные конструктор типа, что делает их различные типы, как отметил @DanielWagner. Самый внешний конструктор Int -> Int
равен ->
, а внешний конструктор Int
- это просто Int
. Достаточно, чтобы два типа имели разный внешний конструктор, считая их разными.
thats смысл. но почему compose = foldr (.) id работает foldr: :(a -> b -> b) -> b -> [a] -> b, но тип id - b-> b –
Тип '(.) 'is '(b -> c) -> (a -> b) -> a -> c', что совпадает с' (b -> c) -> (a -> b) -> (a - > c) '. Он имеет смысл, выполняет функции, принимает 2 функции и возвращает функцию. Тип foldr - '(a -> b -> c) -> b -> [a] -> b'. Чтобы устранить двусмысленность, переименуйте переменные типа: 'foldr :: (fa -> fb -> fb) -> fb -> [fa] -> fb'. '(.) :: (cb -> cc) -> (ca -> cb) -> (ca -> cc)'. Тогда ясно, что приложение 'foldr (.)' Имеет этот тип: '(ca -> cb) -> [cb -> cb] -> (ca -> cb)'. Также: '(.) :: x -> x'. и, наконец, 'foldr (.) Id'is: ' [x -> x] -> (x -> x) '. –
Ключевой идеей, которую вы, кажется, не хватает, является то, что типы такого рода: '(cb -> cc)' могут быть объединены с переменными типа, такими как 'fa'; то, что я сделал, это точно заменить все 'fa's' (cb -> cc) '. И что-то подобное для 'fb' &' (ca-> cb) '. –
(+3)
это не то, что вы, вероятно, думаете. На других языках это означает числовое значение положительных-трех. В Haskell это частичное приложение оператора +
и является функцией, принимающей один аргумент (другой номер для добавления). Он добавляет три к тому, что дается. Таким образом, (+3) x
- это применение функции (+3)
к значению x
и возвращает x+3
. Однако (+3)
(+3)
пытается добавить 3
в функцию (+3)
, что не имеет смысла и дает ошибку типа.
Это может помочь представить замену +
с обычной функцией называется plus
:
plus x y = y + x
Тогда (+3)
эквивалентно plus 3
и (+3) 3
к (plus 3) 3
, который так же, как plus 3 3
. Однако (+3) (+3)
эквивалентен (plus 3) (plus 3)
или plus 3 (plus 3)
, что не имеет смысла.
Возможно, вам стоит подумать о том, что означает (+3) . (+3)
. Это объединяет два приложения добавления трех и представляет собой функцию с одним аргументом, которая добавляет шесть.
Что? Сначала прочитайте [некоторый материал] (http://learnyouahaskell.com/chapters). –
'(+3) (+3)' не будет работать, если вы не сделали экземпляр 'a -> a'' Num'. При этом, если вас интересуют определения, вы должны взглянуть на отчет Haskell. – Zeta
const x y = x negate x = -x мы должны вычислять const const (negate1) (negate2) 3 На первом этапе мой Tutor вычисляет const const (negate1) для const, но –