Nano Hash - криптовалюты, майнинг, программирование

Закрытые семейства типов и вывод типов в Haskell

В GHC-7.7 (и 7.8) были введены семейства закрытого типа:

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

Я хочу спросить вас, почему следующий код не компилируется? GHC должен иметь возможность выводить все типы — GetTheType определен только для типа X, и если мы закомментируем отмеченную строку, код скомпилируется.

Это баг в GHC или в семействах закрытого типа пока нет таких оптимизаций?

код:

{-# LANGUAGE TypeFamilies #-}

data X = X 

type family GetTheType a where
    GetTheType X = X

class TC a where
    tc :: GetTheType a -> Int

instance TC X where
    tc X = 5 

main = do
    -- if we comment out the following line, the code compiles
    let x = tc X
    print "hello"

И ошибка:

Couldn't match expected type ‛GetTheType a0’ with actual type ‛X’
The type variable ‛a0’ is ambiguous
In the first argument of ‛tc’, namely ‛X’
In the expression: tc X

  • 1. GHC 7.8.X еще не выпущен, так что пока рано называть это ошибкой 2. Вы уверены, что семейства закрытых типов будут использоваться по умолчанию и не требуют каких-либо флагов или прагм? 23.12.2013
  • Я только что спросил об этом Ричарда Айзенберга неделю назад, см. комментарии внизу здесь. Я также очень взволнован потенциалом там. Я набросал на бумаге механизм того, как, по моему мнению, должен работать логический вывод, и постепенно вырабатываю у себя идею попытаться взломать GHC, но, честно говоря, я не уверен, что это произойдет в какие-либо разумные сроки. 23.12.2013
  • @ThomasM.DuBuisson: Мы еще не знаем, но, поскольку эта функция доступна в GHC 7.7, мы можем протестировать ее и рассмотреть некоторые из ее поведений как ошибки или нет. GHC 7.8 должен быть выпущен в ближайшее время, я думаю. 26.12.2013

Ответы:


1

В семьях закрытого типа нет ничего плохого. Проблема в том, что не все функции типа инъективны.

Скажем, у вас может быть эта функция закрытого типа:

data X = X
data Y = Y

type family GetTheType a where
    GetTheType X = X
    GetTheType Y = X

вы не можете вывести тип аргумента из типа результата X.

Семейства данных инъективны, но не замкнуты:

{-# LANGUAGE TypeFamilies #-}

data X = X

data family GetTheType a

data instance GetTheType X = RX

class TC a where
    tc :: (GetTheType a) -> Int

instance TC X where
    tc RX = 5

main = do
    let x = tc RX
    print "hello"
23.12.2013
  • Но с семействами закрытых типов GHC может проверить, является ли функция типа инъективной или нет. Я думаю, что это была одна из причин, чтобы иметь их. Я не знаю, если кто-то работает над этим. 23.12.2013
  • @SjoerdVisscher Эта функция была упомянута в документе в разделе будущей работы. Возможно, это будет реализовано в будущем :) 23.12.2013
  • @mgampkay: В какой статье? Не могли бы вы опубликовать ссылку на него, пожалуйста? 26.12.2013
  • @SjoerdVisscher Семейства закрытого типа с перекрывающимися уравнениями research.microsoft.com/en-us/um/people/simonpj/papers/ext-f/ 26.12.2013
  • О, это проливает свет на это загадочное сообщение об ошибке GHC, которое выглядит примерно так: функция типа Foo может быть не инъективной. Когда я увидел это, я подумал: что ты имеешь в виду под словом «может быть»? Это или нет? 29.12.2013
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..