Сравните нулевой список с [(a, b)] Haskell - PullRequest
2 голосов
/ 07 октября 2019

Я немного запутался в том, как работают списки в Haskell. Я знаю, что [] - это пустой список с типом [a]. Есть ли способ определить пустой список с типом [(a, b)]?

Например, я знаю, что null [1] == [] будетдайте нам True

null [(1,2)] == [] дал мне ошибку несоответствующего типа, это то, что я предполагаю.

Я хочу знать, возможно ли сказать что-то вроде null [(1,2)] == [(,)], даст намTrue

Ответы [ 4 ]

7 голосов
/ 07 октября 2019

Я знаю, что [] - это пустой список с типом [a]

Да, но важно понимать, что на самом деле означает «тип [a]». На самом деле это означает тип forall a . [a], то есть это не список элементов какого-то определенного типа «а», а, скорее, при любом выборе типа a, это список этого типа. В частности, это также может быть список типов кортежей. Таким образом, null работает так же хорошо со списками кортежей, как со списками любого другого типа.

Чтобы реально увидеть null в действии с таким списком кортежей, вам просто нужно предоставить один. Например, null [(1,2)] использует его для списка кортежей. Но в случае пустого списка нет содержимого списка, которым вы бы ограничивали тип. Это может быть либо ясно из контекста, как в

Prelude> [null l | l <- [ [], [(1,2)], [(1,3)] ]]
[True,False,False]

, либо вы можете явно указать его с подписью

Prelude> null ([] :: [(String, Double)])
True
5 голосов
/ 07 октября 2019

Есть ли способ определить пустой список с типом [(a,b)]?

Просто []. Действительно, [] - пустой список, но тип элементов бесплатный. Он имеет тип [a], но a может совпадать с (b, c), поэтому 2-кортеж с двумя различными типами.

Например, я знаю, что null [1] == [] даст нам True

null :: Foldable f => f a -> Bool - это функция, которая принимает f a (в данном случае [a]) и возвращаетBool. проверяет , является ли список пустым. не генерирует список.

2 голосов
/ 07 октября 2019

я бы объявил мой список, как показано ниже:

let myList = [] :: [(Integer, Integer)]

, тогда myList будет иметь тип :t myList даст myList :: [(Integer, Integer)]

При оценке null myList это даст True

0 голосов
/ 08 октября 2019

Каждый тип списка представлен как []. Если вы хотите указать тип, вы можете использовать сигнатуру ([] :: [(a, b)]), но часто компилятор может вывести тип из контекста:

λ> [] == [(1, 'x')]
False
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...