Size: a a a

2021 April 12

UT

Unknown T. in Haskell
Добрый день! Как определить тип, соответствующий списку [1, [2, [3, …]]] ?
Моя попытка: data MyList a = MyElem a | MyList [MyList a], но не выглядит корректно...
источник

L

Lierdakil in Haskell
В списке (обычном) элементы всегда одного типа же. Поэтому вопрос как-то странно сформулирован. У [1, [2, ...]] типы элементов не сходятся
источник

AS

Alex Sh in Haskell
data List a = Nil | Cons a (List a)
источник

UT

Unknown T. in Haskell
Аа, точно. Значит мне нужен tuple
источник

L

Lierdakil in Haskell
Меня терзают смутные сомнения. Конструкция (1, (2, (3, ...))) изоморфна обычному человеческому линейному списку (вероятно бесконечному)
источник

UT

Unknown T. in Haskell
Хотя почему, я же могу определить свой тип элемента, который может быть либо элементом типа a, либо списком? Тогда список состоит из одного типа - моего кастомного
источник

L

Lierdakil in Haskell
Я не пойму что Вы пытаетесь сделать. Может объясните?
источник

UT

Unknown T. in Haskell
Разбираюсь со списками. Задача преобразовать список [1, 2, 3] к [1, [2, [3, …]]]. Пытаюсь типизировать эту функцию
источник

к

кана in Haskell
а в этом "списке" на каком-нибудь уровне могут быть несколько элементов?
источник

к

кана in Haskell
то есть [1, 2, [3, 4]] это валидно?
а
[1, 2, [3, 4], 5] ?
источник

UT

Unknown T. in Haskell
Вообще всегда 2 элемента, получается
источник

к

кана in Haskell
тогда это [] называется
источник

к

кана in Haskell
он так и определен, [a] это или [], или пара из элемента и исписка
источник

к

кана in Haskell
(1 : (2 : (3 : [])))
источник

к

кана in Haskell
нельзя, не определив свой тип
источник

UT

Unknown T. in Haskell
Так я и хочу определить свой тип
источник

к

кана in Haskell
data NList a
 = Empty
 | ConsE a (NList a)
 | ConsL (NList a) (NList a)

вот тут можно

[1, [2, [3], 4], 5]

ConsE 1 (ConsL (ConsE 2 (ConsL (ConsE 3 Empty) (ConsE 4 Empty))) (ConsE 5 Empty))

альтернативно операторами:

data NList a
 = E
 | a :+ NList a
 | NList a :* NList a
 deriving (Show)

infixr 5 :+

infixr 5 :*

x :: NList Int
x = 1 :+ (2 :+ (3 :+ E) :* 4 :+ E) :* 5 :+ E
источник

к

кана in Haskell
то есть мы явно консим или элемент, или н-список
источник

L

Lierdakil in Haskell
Глядя на постановку по-моему будет просто data L a = Nil | L a (L a), но это обычный список в конечном итоге.
источник

UT

Unknown T. in Haskell
Я только недавно начал разбираться с типами. В этой записи ConsE — это произвольное имя, которым мы объявляем новый тип внутри с записью a (NList a), правильно?
источник