2015-05-14 4 views
1

Я новичок в Haskell и имею проблему с функциями функций в Haskell. Значения функции в Haskell, правильно? (+3) 3 = 6, но что означает (+3) (+3). Принимает ли (+3) значение?Haskell: функции и значения

+4

Что? Сначала прочитайте [некоторый материал] (http://learnyouahaskell.com/chapters). –

+1

'(+3) (+3)' не будет работать, если вы не сделали экземпляр 'a -> a'' Num'. При этом, если вас интересуют определения, вы должны взглянуть на отчет Haskell. – Zeta

+0

const x y = x negate x = -x мы должны вычислять const const (negate1) (negate2) 3 На первом этапе мой Tutor вычисляет const const (negate1) для const, но –

ответ

1

(+3) (+3) - это просто ошибка типа и, следовательно, он не будет компилироваться.

Тип (+3) является Int -> Int, что означает, что при применении Int, мы получим еще Int. Это также означает, что можно применять только значения типа Int!

Таким образом, вы не можете применить к (+3) значение типа Int -> Int, только значения типа Int.

Так что да, (+3) - это значение, но не правильного типа, чтобы применить его к функции, ожидающей значения типа Int.

Int не могут быть объединены с Int -> Int, потому что они имеют разные конструктор типа, что делает их различные типы, как отметил @DanielWagner. Самый внешний конструктор Int -> Int равен ->, а внешний конструктор Int - это просто Int. Достаточно, чтобы два типа имели разный внешний конструктор, считая их разными.

+0

thats смысл. но почему compose = foldr (.) id работает foldr: :(a -> b -> b) -> b -> [a] -> b, но тип id - b-> b –

+0

Тип '(.) '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) '. –

+0

Ключевой идеей, которую вы, кажется, не хватает, является то, что типы такого рода: '(cb -> cc)' могут быть объединены с переменными типа, такими как 'fa'; то, что я сделал, это точно заменить все 'fa's' (cb -> cc) '. И что-то подобное для 'fb' &' (ca-> cb) '. –

3

(+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). Это объединяет два приложения добавления трех и представляет собой функцию с одним аргументом, которая добавляет шесть.