Подтвердить что ты не робот

Есть ли способ разрешить синонимы типов в haskell?

Когда вы создаете синоним типа с type, ghc/ghci будет использовать его вместо исходного типа всякий раз, когда он будет использоваться явно, но никогда не будет пытаться работать назад от предполагаемого типа до соответствующего синонима. Получение наиболее "абстрактного" синонима для типа было бы очень полезно для изучения сложных приложений и библиотек, которые определяют синонимы для стеков монады и, возможно, синонимы синонимов.

Кто-нибудь когда-либо писал такой кусок кода? Я предполагаю, что это будет откат, и это также создаст некоторые побочные кандидаты (например, если два типа являются псевдонимами String, тогда они будут кандидатами, когда String необходимо разрешить), но это может быть полезно в определенных ситуациях.

4b9b3361

Ответ 1

Не ответ, а вопрос. Типичные синонимы часто используются для красивого названия типов в "высокоуровневом коде", но как только вы передаете эти типы на более низкий уровень/код помощника (которые определены в терминах более конкретных типов), как система должна отслеживать, какие синоним применяется? рассмотрим следующее:

type Title = String
type Name  = String

capitalise :: String -> String

my_title = "Mayor" :: Title

shouted_title = capitalise my_title :: ???

Как специалист typechecker знает, что String, входящая в функцию heleper capitalise, концептуально является тем же типом, что и строка, выходящая из capitalise? При наличии нескольких псевдонимов типов, как должен выбрать контролер типа, который следует использовать?

Ответ 2

Компилятор Frege, IDE и REPL попытаются сделать это для приложений типа (кроме приложений (- > )), когда их попросят показать "хорошие" типы, и это работает в большинстве случаев. Ниже приведен пример онлайн-сеанс:

frege> type Flubber = (Int, Double)
frege>  x = (42, 3.0)
frege> :t x    
Flubber
frege> y = [x,x,x,x]
frege> :t y
[Flubber] 

Итак, в принципе, он также должен работать в Haskell (возможно, по модулю определенных расширений в системе типов относительно Haskell 2010).

Имейте в виду, что, как заметил в своем ответе @Thomas в своем ответе, может быть несколько способов исключить псевдонимы типов и, следовательно, вывод может фактически ввести в заблуждение.