Вопрос по types, haskell – Списки типов данных на Haskell

6

Вероятно, это еще один легкий вопрос Хаскеля. Если у меня есть некоторые "вложенные" типы данных, такие как в этом примере кода:

data Place = Country
           | State
           | City String
           deriving Show

data State = California
           | NewYork
           deriving Show

data Country = USA
             | Canada
             deriving Show

Я могу на законных основаниях создать список, например [США, Канада] типа [Страна] или [Калифорния, Нью-Йорк] типа [Штат] или [Город »a», Город »b» типа [Место] ,

Что мне нужно сделать, чтобы составить список, такой как [США, Нью-Йорк]? Нью-Йорк - это штат, который представляет собой место, а США - это страна, которая является местом, но ghci видит США, поэтому предполагает, что я составляю список стран (а Нью-Йорк - это штат, поэтому список не выполняется).

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

Я пытаюсь не выбрасывать данные, содержащиеся в State и Country, в тип Place, который, я знаю, заставил бы его работать, но у меня есть приличное количество реальных данных, которые я не буду так смешивать.

Ваш Ответ

3   ответа
12

Вот немного больше выводов, которые привели меня к выяснению проблемы:

*Main> [State, State]
[State,State]
*Main> :t State
State :: Place
*Main> :t NewYork
NewYork :: State

Похоже, это подразумевает, что слово «государство» является допустимым конструктором для Place и что состояние данных относится только к значению California или NewYork.

Если вы измените программу немного, чтобы:

data Place = Country Country
           | State State
           | City String
           deriving Show

data State = California
           | NewYork
           deriving Show

data Country = USA
             | Canada
             deriving Show

затем вы можете составить список, например [Страна США, штат Нью-Йорк], который имеет тип [Место]. Использование одного и того же слова дважды, как в первом примере, не «связывает» Государство набирает вместе так, как я думал.

Конечно, использование конструктора State State - это просто вопрос предпочтений, так же легкоAmericanState State в типе места, если бы я был так склонен.

Error: User Rate Limit Exceeded Mark Rushakoff
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
4

Вы создаете гетерогенный список (то есть список содержит значения разных типов). Такая структура может быть статически или динамически типизирована. В любом случае, поскольку мы знаем, что значение поддерживает определенный интерфейс, мы можем использовать его в виде списка.

Самый хороший подход, IMO, это через экзистенциальную типизацию, как показывает эфимант:

  • all values support the Show interface
  • anything that supports Show can be put in the list
  • the type system guarantees you can't break the abstraction
7
{-# LANGUAGE ExistentialQuantification #-}
data GenericPlace = forall a. Show a => GenericPlace a
places :: [GenericPlace]
places = [GenericPlace USA, GenericPlace NewYork]

УвидетьРуководство пользователя GHC # 7.4.4 Существенно количественно определенные конструкторы данных для некоторых ограничений с этим подходом.


Подробное исследование о создании пригодных для использования гетерогенных коллекций в Haskell.

Strongly typed heterogeneous collections

A heterogeneous collection is a datatype that is capable of storing data of different types, while providing operations for look-up, update, iteration, and others. There are various kinds of heterogeneous collections, differing in representation, invariants, and access operations. We describe HList --- a Haskell library for strongly typed heterogeneous collections including extensible records. We illustrate HList's benefits in the context of type-safe database access in Haskell. The HList library relies on common extensions of Haskell 98. Our exploration raises interesting issues regarding Haskell's type system, in particular, avoidance of overlapping instances, and reification of type equality and type unification.

Похожие вопросы