Если вас look at the documentation, вы увидите, что тип для (<)
дается как
(<) :: a -> a -> Bool
Это заблуждение!
Объявление типа появляется в определении класса типов:
class Eq a => Ord a where ...
Так полный типа является
(<) :: Ord a => a -> a -> Bool
Кстати, если вы спросите GHCi какого типа (<)
«s это, он получит это право ,
Prelude> :t (<)
(<) :: (Ord a) => a -> a -> Bool
Также отметим, что уже функция называется min
, в том же класса типов.
min :: Ord a => a -> a -> a
Таким образом, вы не можете назвать вашу функцию min
если вы не скрыть оригинальный min
. (Я не собираюсь показать вам, как. Используйте другое имя для функции вместо.)
Наконец, теперь у вас есть
min :: Ord a => a -> a -> Bool
min a b = if a < b then True else False
Как отмечает Сара, if blah then True else False
такой же, как blah
, так что вы можете упростить для более четкого
min :: Ord a => a -> a -> Bool
min a b = a < b
Теперь операторы в Haskell являются только функции с забавными названиями --- это то же самое, как
min :: Ord a => a -> a -> Bool
min a b = (<) a b
Мы можем упростить это далее:
min :: Ord a => a -> a -> Bool
min = (<)
Так что ваш min
это просто другое название для (<)
. Почему бы просто не использовать оригинал <
вместо min
?
if foo then True else False всегда можно переписать как просто foo – Sarah
Спасибо за это! –
И в следующий раз, если у вас есть сомнения, вы можете просто оставить аннотацию типа в верхней части и спросить компилятор во многих случаях. Таким образом: t min дает мне правильный тип с ограничением Ord, когда я запрашиваю ghci об этом. – Sarah