Инструмент
, №. Советы, да:
Кроме того, здесь вы можете задать конкретные запросы. Предоставьте SHOW CREATE TABLE
и EXPLAIN SELECT ...
Поскольку подпись уже ограничивает тип, вы можете удалить часть :: a
в теле функции:
getMaxBound :: Bounded a => a -> a
getMaxBound _ = maxBound
Подпись типа указывает этот тип вход функции совпадает с типом выхода функции.
Например:
Prelude> getMaxBound (3 :: Int)
9223372036854775807
Prelude> getMaxBound 'c'
'\1114111'
Prelude> getMaxBound True
True
Prelude> getMaxBound LT
GT
ScopedTypeVariables
Мы также можем использовать ScopedTypeVariables
расширение [Haskell-wiki] , а затем реализовать его со ссылкой на переменную типа a
:
{-# LANGUAGE ScopedTypeVariables #-}
getMaxBound :: forall a . Bounded a => a -> a
getMaxBound _ = maxBound :: a
В этом случае ответ Виллема должен работать очень хорошо, но альтернативой, которая также может быть полезна в более сложных случаях, является использование -XScopedTypeVariables
, если вы добавляете строку {-# LANGUAGE ScopedTypeVariables #-}
к вершине файл, ваш код должен скомпилироваться.
Расширение позволяет ссылаться на переменные типа из внешней области видимости во внутренней области видимости. в вашем коде a
затеняется в теле функции, и нет связи между ним и внешним a
, что приводит к потере контекста Bounded a
!