Я знаю, что тип:Что означает тип a -> b Bool в Haskell?
a -> Bool
является функция, которая принимает в качестве входного что-то типа а и выводит логическое значение.
Что Тип:
a -> b Bool
означает?
Я знаю, что тип:Что означает тип a -> b Bool в Haskell?
a -> Bool
является функция, которая принимает в качестве входного что-то типа а и выводит логическое значение.
Что Тип:
a -> b Bool
означает?
Возможно, это будет яснее, если вы напишете его с помощью явных квантований и аннотаций вида. Поэтому a -> b Bool
средства ...
forall (a :: *) (b :: * -> *). a -> b Bool
b
является конструктор типа принимает один аргумент типа. Примеры конструкторов типа с одним аргументом изобилуют: Maybe
, []
, IO
- все это примеры того, что вы могли бы использовать для создания экземпляра b
.
Функция f :: a -> b Bool
принимает аргумент любого типа a
; его возвращаемое значение является конструктором типа по вашему выбору с его параметром, заполненным как Bool
.
Параметричность говорит нам, что нет таких (не-⊥) терминов с таким типом.
Я абсолютный новичок, этот ответ имеет много вещей, которые я не понимаю. Я не совсем понимаю, что Может быть, значит, и я также не понимаю, что означает символ ⊥. –
Символ ⊥ называется «нижним», и в основном это означает «патологические термины», такие как те, которые навевают ошибки или петли. Моя любимая книга начинающих Haskell - «Learn You A Haskell For Great Good», которую вы можете [читать онлайн бесплатно] (http://learnyouahaskell.com/chapters). Удачи в изучении этого красивого языка! –
В b Bool
, b
обозначает параметризованного типа, который принимает один параметр типа (в Haskell языке, b
является конструктором типа доброго * -> *
), такие как Maybe
, IO
или []
.
Таким образом, функция типа a -> b Bool
может, например, принимать Int
и производить Maybe Bool
, IO Bool
, [Bool]
т.д.
@ ThomasM.DuBuisson В контексте сообщений об ошибке типа, которые не применяются. Когда компилятор говорит, что он ожидает, что тип 'a -> b Bool' не означает, что функция действительно нуждается в этом точном типе, вы можете дать ей функцию' Int -> Maybe Bool', и она будет удовлетворена. – sepp2k
Совершенно верно, как я неаккуратно. –
@ sepp2k ... если 'b' не является жестким –
В этом случае 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)
Это что, весь тип? Или есть такой контекст, как '(Foldable b) => a -> b Bool'? – Lee
У меня не было больше контекста о типе, я вижу a -> b Bool в первый раз через объятия Ошибка типа: *** Не соответствует: a -> b Bool –
Не могли бы вы добавить код, который приводит к этой ошибке? – Lee