я исполню это заявление на переводчикаfoldr путаницы
foldr (\x (a, b) -> if x == '_' then (a+1, [((div a 3), (mod a 3))] ++ b) else (a, b)) (0, []) "_______OX"
я ожидал выход быть
(7,[(0,0),(0,1),(0,2),(1,0),(1,1),(1,2),(2.0)])
однако выход
(7,[(2,0),(1,2),(1,1),(1,0),(0,2),(0,1),(0,0)])
, что я делаю неправильно. Насколько мне известно, foldr начинается с последнего элемента списка, и моя функция лямбда добавляет его в начало списка аккумуляторов. Поэтому я должен получить (0,0) как первый элемент. Однако, это наоборот, и я озадачен. :(
Кроме того, маленький вопрос? - Как я могу идти о назначении тегов на вопросы, подобные этим
Если '(0, 0) 'был первым элементом * добавил * в список, то это было бы быть последним элементом * списка *. Это то, о чем вы смущены? – Pubby
Для лучшей читаемости вы всегда можете заменить '[a] ++ b' на' a: b' или '(a): b' (в зависимости от формы a, но в большинстве случаев это просто' a'). Кроме того, '((a), (b))' всегда может быть ** записано '(a, b)' – Ingo
@pubby, да. не является ли элемент, который сначала считывается, становясь последним элементом в конечном списке? – shashydhar