Рассмотрим следующую функцию:
foo :: Show a => Maybe a -> [Char]
foo (Just x) = show x
foo Nothing = "Nothing"
Затем я пытаюсь использовать эту функцию:
bar :: [Char]
bar = foo Nothing
Аргумент, который был передан foo
, имеет тип Maybe a
, где a
не указан, и на самом деле нас не волнует a
, потому что мы используем только регистр foo
для Nothing
. Но GHC утверждает, что предоставил конкретный тип:
Неопределенная переменная типа a0
, возникающая в результате использования foo
препятствует разрешению ограничения (Show a0)
. вероятный
исправление: используйте аннотацию типа, чтобы указать, что a0
должно быть.
GHC подсказывает, чтобы указать тип. Таким образом, единственное исправление, которое я вижу, это создание поддельного типа, который имеет экземпляр класса Show
:
{-# LANGUAGE EmptyDataDecls, KindSignatures #-}
{-# OPTIONS_GHC -fno-warn-missing-methods #-}
data Dummy :: *
instance Show Dummy
bar :: [Char]
bar = foo (Nothing :: Maybe Dummy)
foo :: Show a => Maybe a -> [Char]
foo (Just x) = show x
foo Nothing = "Nothing"
Это работает, но кажется довольно простым. Но настоящая причина, почему мне не нравится это решение, состоит в том, что для моих целей этот код автоматически генерируется из некоторых метаданных, которые не предоставляют информацию о том, какой конкретный тип полиморфа должен быть указан как Dummy
(могут быть пользовательские типы данных с более чем одним параметром). Поэтому мне интересно, есть ли способ сказать GHC, что если тип не указан, этот тип не имеет значения?