Как получить maxBound типа с экземпляром Bounded

Инструмент

, №. Советы, да:

Index Cookbook RK's RoTs

Кроме того, здесь вы можете задать конкретные запросы. Предоставьте SHOW CREATE TABLE и EXPLAIN SELECT ...

1
задан MMacphail 19 January 2019 в 11:18
поделиться

2 ответа

Подпись типа достаточна

Поскольку подпись уже ограничивает тип, вы можете удалить часть :: 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
0
ответ дан Willem Van Onsem 19 January 2019 в 11:18
поделиться

В этом случае ответ Виллема должен работать очень хорошо, но альтернативой, которая также может быть полезна в более сложных случаях, является использование -XScopedTypeVariables

, если вы добавляете строку {-# LANGUAGE ScopedTypeVariables #-} к вершине файл, ваш код должен скомпилироваться.

Расширение позволяет ссылаться на переменные типа из внешней области видимости во внутренней области видимости. в вашем коде a затеняется в теле функции, и нет связи между ним и внешним a, что приводит к потере контекста Bounded a!

0
ответ дан sara 19 January 2019 в 11:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: