polyTypeOf таинственный - PullRequest
       1

polyTypeOf таинственный

6 голосов
/ 31 октября 2011

PolyTypeable является аналогом Typeable для полиморфных типов. Но это работает довольно непредсказуемо:

ghci> :t show
show :: Show a => a -> String
ghci> polyTypeOf show
a1 -> [Char]
ghci> :t fromEnum 
fromEnum :: Enum a => a -> Int
ghci> polyTypeOf fromEnum 

<interactive>:1:12:
    Ambiguous type variable `a0' in the constraint:
      (Enum a0) arising from a use of `fromEnum'
    Probable fix: add a type signature that fixes these type variable(s)
    In the first argument of `polyTypeOf', namely `fromEnum'
    In the expression: polyTypeOf fromEnum
    In an equation for `it': it = polyTypeOf fromEnum

Исходный код библиотеки довольно сложен для понимания, не могли бы вы объяснить, почему polyTypeOf принимает определенный набор аргументов и не принимает другие, даже очень похожие?

1 Ответ

7 голосов
/ 31 октября 2011

Причина та же, что и для

Prelude> show undefined
"*** Exception: Prelude.undefined
Prelude> fromEnum undefined

<interactive>:0:1:
    Ambiguous type variable `a0' in the constraint:
      (Enum a0) arising from a use of `fromEnum'
    Probable fix: add a type signature that fixes these type variable(s)
    In the expression: fromEnum undefined
    In an equation for `it': it = fromEnum undefined

а именно, расширенные правила по умолчанию ghci позволяют ему разрешать неоднозначность для ограничения Show, но не для ограничения Enum. Если вы попытаетесь скомпилировать исходный файл с foo = polyTypeOf show, вы также получите ошибку переменной неоднозначного типа (если вы не используете {-# LANGUAGE ExtendedDefaultRules #-}).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...