Функция Haskell, которая преобразует тип в строку по типу приложения - PullRequest
0 голосов
/ 12 мая 2018

Итак, я хотел бы иметь такую ​​функцию / значение:

converter :: Converter a

, где Converter будет некоторым семейством типов, которое всегда приводит к String и используется только для того, чтобы мыможно применить тип, который мы хотим преобразовать в String, используя приложение типа, например,

converter @Int => "Int"

Я думал об использовании класса Typeable, который имеет функцию typeOf.К сожалению, для его работы требуется фактическое значение.

Я мог бы использовать Proxy для предоставления "фактического" значения, но тогда мне пришлось бы удалить Proxy из полученного String, и это чувствуетсянемного грязный и подверженный ошибкам.

Мысли?

Ответы [ 2 ]

0 голосов
/ 12 мая 2018

Мы могли бы использовать несколько расширений: AllowAmbiguousTypes, TypeApplications, ScopedTypeVariables и создать вариант ответа @ Cubic.

> :{
| convert :: forall a . Typeable a => String
| convert = show . typeRep $ Proxy @ a
| :}
> convert @ Int
"Int"
> convert @ String
"[Char]"
> convert @ Float
"Float"
0 голосов
/ 12 мая 2018

Почему бы не просто

{-# LANGUAGE TypeApplications #-}

import Data.Typeable

main = print $ typeRep (Proxy @Int)

typeRep, предназначенный для использования прокси-сервера, и будет заниматься только типом этого прокси-сервера (поэтому не нужно ничего удалять).Конечно, дополнительный Proxy там не совсем синтаксис, который вы ищете, но это почти то же самое, верно?

...