2016-12-02 6 views
0

Я знаю, что тип:Что означает тип a -> b Bool в Haskell?

a -> Bool 

является функция, которая принимает в качестве входного что-то типа а и выводит логическое значение.

Что Тип:

a -> b Bool 

означает?

+2

Это что, весь тип? Или есть такой контекст, как '(Foldable b) => a -> b Bool'? – Lee

+0

У меня не было больше контекста о типе, я вижу a -> b Bool в первый раз через объятия Ошибка типа: *** Не соответствует: a -> b Bool –

+3

Не могли бы вы добавить код, который приводит к этой ошибке? – Lee

ответ

3

Возможно, это будет яснее, если вы напишете его с помощью явных квантований и аннотаций вида. Поэтому a -> b Bool средства ...

forall (a :: *) (b :: * -> *). a -> b Bool 

b является конструктор типа принимает один аргумент типа. Примеры конструкторов типа с одним аргументом изобилуют: Maybe, [], IO - все это примеры того, что вы могли бы использовать для создания экземпляра b.

Функция f :: a -> b Bool принимает аргумент любого типа a; его возвращаемое значение является конструктором типа по вашему выбору с его параметром, заполненным как Bool.

Параметричность говорит нам, что нет таких (не-⊥) терминов с таким типом.

+1

Я абсолютный новичок, этот ответ имеет много вещей, которые я не понимаю. Я не совсем понимаю, что Может быть, значит, и я также не понимаю, что означает символ ⊥. –

+1

Символ ⊥ называется «нижним», и в основном это означает «патологические термины», такие как те, которые навевают ошибки или петли. Моя любимая книга начинающих Haskell - «Learn You A Haskell For Great Good», которую вы можете [читать онлайн бесплатно] (http://learnyouahaskell.com/chapters). Удачи в изучении этого красивого языка! –

7

В b Bool, b обозначает параметризованного типа, который принимает один параметр типа (в Haskell языке, b является конструктором типа доброго * -> *), такие как Maybe, IO или [].

Таким образом, функция типа a -> b Bool может, например, принимать Int и производить Maybe Bool, IO Bool, [Bool] т.д.

+3

@ ThomasM.DuBuisson В контексте сообщений об ошибке типа, которые не применяются. Когда компилятор говорит, что он ожидает, что тип 'a -> b Bool' не означает, что функция действительно нуждается в этом точном типе, вы можете дать ей функцию' Int -> Maybe Bool', и она будет удовлетворена. – sepp2k

+0

Совершенно верно, как я неаккуратно. –

+0

@ sepp2k ... если 'b' не является жестким –

4

В этом случае b является более высокой kinded типа, то есть в зависимости от типов к типам. Звучит страшно? Не бойся! Более высокий тип типа похож на тип списка. ([]) на своем собственном не является типом, но он по-прежнему принимает аргумент, чтобы стать одним, поэтому ([]) Int = [Int] - это тип.

Виды, подобные типам, и тип полностью применяемого типа: *. Тип списка, с другой стороны, - * -> *. Поэтому он принимает тип * (например, Int) и возвращает тип (например, [Int]). Другими примерами будут Maybe, IO или тип функции (->), который имеет вид * -> * -> *, поскольку он по-прежнему принимает типы, тип аргумента и тип результата (например, (->) Int Bool = Int -> Bool).

Функция, которую вы указали, на самом деле невозможно реализовать, как функция типа a -> b. Однако мы могли бы реализовать следующую функцию:

pureEq :: (Eq a, Applicative b) => a -> a -> b Bool 
pureEq x y = pure (x == y) 
Смежные вопросы