как выровнять список ( многомерный список до одномерного списка ) в haskell

#haskell #flatten

Вопрос:

Я хочу выровнять список любых измерений до 1 списка измерений этот код работает для всех тестовых наборов, за исключением пустого 2d-списка

 import Prelude hiding (foldl)   foldl :: (b -gt; a -gt; b) -gt; b -gt; [a] -gt; b foldl fun init list =  case list of  [] -gt; init  (head:tail) -gt; foldl fun (fun init head) tail   flatten_l :: [[a]] -gt; [a] flatten_l xss = foldl ( ys xs -gt; ys    xs) [] xss   main = interact ( s -gt; show $ flatten_l [[1,2,3], [4,5], [6], [], [7,8,9], []] )  

это не работает для ввода — [[ ]]

main = interact ( s -gt; show $ flatten_l [[]] )

Комментарии:

1. Что значит для вас «измерение»? Похоже, это не то же самое, что большинство людей подразумевают под этим словом- flatten_l только уменьшает измерение на 1 в том смысле, в каком большинство людей подразумевают «измерение», это не уменьшает измерение до 1. Что значит «не работает»? Какой результат вы получаете? Что вы ожидаете получить взамен?

2. для ввода [[]] я получаю неоднозначную по ошибке переменную типа «a0», возникающую из — за использования «показать», которая предотвращает решение ограничения » (Показать a0)». результат, который я хочу, это []

Ответ №1:

Список [] может отображаться по-разному в зависимости от его типа*. Наиболее важным примером этого является то , что [] :: String показано как "" , в то время как для большинства других типов списков это так [] .

Чтобы выбрать между этими способами поведения, вы должны сообщить GHC, какой тип вы хотите, чтобы у вас [] был. Сравнить:

 -- ambiguous type variable error main = print []  -- works, prints "" main = print ([] :: [Char])  -- works, prints [] main = print ([] :: [Int])  

* На самом деле, [] в этом нет ничего особенного-любой список может отображаться по-разному в зависимости от его типа. Однако редко можно увидеть эту проблему со списками, содержащими элементы, потому что редко бывает, чтобы элементы были полиморфными. Таким образом, [] особенность заключается в том, что на самом деле в нем нет никаких элементов, которые могли бы дать компилятору подсказку о его типе, а не в том, что его экземпляры зависят от его типа.