Как представить список списка через представление этого типа данных

с использованием:

data type List a = Empty | Cons a (List a)

Как можно представить [[a]]? У этого должно быть простое решение, к которому я просто слеп, поэтому чей-то вклад будет очень признателен, спасибо!

Я пытался использовать List (List a) или List (Cons x xs), но это отвечает «Список», не входящий в область действия, что для меня имеет смысл.


person Tempro43    schedule 08.06.2019    source источник
comment
Тип действительно List (List a), но это для типа, а не для значения.   -  person Willem Van Onsem    schedule 08.06.2019
comment
Если вы хотите создать список списков, который содержит, например, один 1, значение равно Cons (Cons 1 Empty) Empty.   -  person Willem Van Onsem    schedule 08.06.2019
comment
Также FYI data type LIst a = ... является недопустимым синтаксисом. Это похоже на объявление data, но есть и объявление type для других целей. Но не оба.   -  person luqui    schedule 09.06.2019


Ответы (1)


Тип списка списков a действительно List (List a)). Но мы не создаем значение с этим.

Если мы, например, хотим построить список с одноэлементным списком, который содержит 1, мы можем написать это так:

oneList1 :: List (List Int)
oneList1 = Cons (Cons 1 Empty) Empty

Внешний Cons является минусом внешнего списка, так как первый (и единственный) элемент имеет Cons 1 Empty, это внутренний список. Cons h t представляет собой список с h (здесь 1) в начале (первый элемент) и Empty в конце (остальные элементы). Итак, Cons 1 Empty — это одноэлементный список с 1 единственным значением.

Мы оборачиваем это во внешние cons Cons (Cons 1 Empty) Empty, что таким образом указывает, что внешний список также является одноэлементным списком. Таким образом, oneList1 эквивалентно [[1]].

person Willem Van Onsem    schedule 08.06.2019
comment
Спасибо! Слишком долго застрял на concatL для этого типа данных ... какие-нибудь полезные советы? ржу не могу - person Tempro43; 08.06.2019
comment
@ Tempro43: обычно это помогает разделить на базовые или рекурсивные случаи. Что будет concatL Empty Empty = ...? или concatL Empty (Cons x xs) = ...? и т. д. - person Willem Van Onsem; 08.06.2019
comment
Хорошо, благодаря вашему ответу я получил concatL (Cons x xs) Empty ) = (Cons x xs) Но это кажется неправильным. может рекурсия вниз хз? но что, если xs не имеет типа (List (List a)) и нарушает сигнатуру типа?? ааа - person Tempro43; 08.06.2019
comment
имел в виду conatL (Cons (Cons x xs) Empty (или xss?)) = (Cons x xs) как действовать как функция, которая убирает список списков в один список, но затем я должен добавить (или что-то) эти списки вместе, чтобы быть одним списком? - person Tempro43; 08.06.2019
comment
@ Tempro43: concatL (Cons x xs) Empty = Cons x xs правильно. Нет необходимости повторяться в этом. Для concatL (Cons x xs) (Cons y ys) ситуация, конечно, сложнее. - person Willem Van Onsem; 08.06.2019
comment
Потрясающе, спасибо! Ввод помог моему пониманию. - person Tempro43; 08.06.2019