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