Проверка того, являются ли некоторые данные какого-либо типа в Хаскеле или нет? - PullRequest
4 голосов
/ 16 июня 2011

, поскольку в Haskell такая выразительная система типов, поддерживается ли что-то напрямую, что мы можем запросить, являются ли некоторые данные какого-либо типа?как в Racket, (String? "Hi") (вернется true) или как MyType? somedata -> Bool

Ответы [ 5 ]

19 голосов
/ 16 июня 2011
isInt :: Int -> Bool
isInt _ = True

isString :: String -> Bool
isString _ = True

...
12 голосов
/ 16 июня 2011

В общем, строгая типизация означает, что вы не попадаете в такую ​​ситуацию с самого начала; вы всегда знаете тип, который вам дали, или , вы ничего не знаете об этом, но имеете словарь поддерживаемых функций (экземпляры классов типов). GHC имеет Data.Typeable, когда вы играете грязные трюки с системой типов, чтобы получить общие типы.

7 голосов
/ 16 июня 2011

По сути, ваш вопрос не имеет смысла в Haskell.

Haskell знает тип всего статически - во время компиляции.Таким образом, нет понятия «тестирование для типа» - что будет динамическим тестом.Фактически, GHC стирает всю информацию о типах, поскольку она никогда не требуется во время выполнения.


Единственными исключениями из этого могут быть случаи, когда данные представлены в сериализованном формате, например в строке.Затем вы используете синтаксический анализ как способ проверки, имеет ли значение правильный тип.Или, для опытных пользователей, некоторая информация о типе может потребоваться во время выполнения для разрешения определенных общих операций более высокого порядка.

1 голос
/ 16 июня 2011

Если вам нужно проверить тип динамически, значит, вы сделали что-то не так. Обычно это справедливо для большинства языков с реконструкторами типов, поэтому функциональные языки, такие как Haskell или OCaml или F #.

У вас сильный реконструктор типов и сопоставление с образцом, зачем вам запрашивать тип?

0 голосов
/ 17 июня 2011

В дополнение к другим ответам ...

Вы можете, если хотите, использовать модуль Data.Dynamic для работы с динамическими типами в Haskell.Например:

> let dyns = [ toDyn (5 :: Int), toDyn "hello", toDyn not ]

Затем вы можете легко написать тест для определенного типа, используя fromDynamic:

isString :: Dynamic -> Bool
isString dyn = isJust (fromDynamic dyn :: Maybe String)

И вы можете применить его к любому значению Dynamic, чтобы определитьесли он содержит String:

> map isString dyns
[False,True,False]

Итак, если вы решите использовать динамическую типизацию с использованием модуля Data.Dynamic, тогда да, вы можете сделать это.

...