2015-03-30 8 views
0

Кажется, я боюсь чего-то, что должно быть чрезвычайно простым в Haskell, но я просто не могу понять это, и мне нужна помощь. Я пытаюсь преобразовать список целых чисел ([3,2,1]) и преобразовать его в одно целое (321).Список целых чисел в одно целое - Haskell

Вот то, что я до сих пор:

fromDigits :: [Integer] -> Integer 
fromDigits [] = 0; 
fromDigits (x:xs) = x : fromDigits (xs) 

Что я делаю неправильно?

+0

Что вы намерены ваша программа, чтобы сделать, если список ввода имеет многозначные числа, таких как '[3, 21, 0]'? –

+0

Вам нужно будет указать позицию каждого номера и (IIRC), поднимите номер на базу (я угадываю 10 здесь) и добавлю его к предыдущим номерам. – Carcigenicate

+0

Они не будут допущены, я просто делаю цифры от 0-9, ничего 10+ – camrymps

ответ

4

Вы можете использовать worker wrapper подход, чтобы сделать это:

fromDigits :: [Integer] -> Integer 
fromDigits xs = aux xs 0 
    where aux [] acc = acc 
      aux (x:xs) acc = aux xs ((acc * 10) + x) 

Демо:

λ> fromDigits [3,2,1] 
321 

Или даже вы можете использовать функцию более высокого порядка foldl:

λ> foldl' (\acc x -> (acc * 10) + x) 0 [1,2,3] 
123 
+0

Спасибо @Sibi, это было именно то, что я искал! – camrymps

3

Это не a преобразование. Список [3,2,1] может «выглядеть» как номер 321, но это не взаимно однозначное отношение (поскольку Грэг упоминал - [32,1] выглядит примерно одинаково), и, конечно же, не канонический (зачем использовать базу 10? Это на самом деле шестнадцатеричный?) Следовательно, действительно нет причин, почему это должно быть быть особенно простым в Haskell . This is not JavaScript, fortunately.

Повтор сообщения ... выглядит, как номер 321, и все, это не имеет отношения к числу действительно значимым образом. Итак, если вам действительно нужно реализовать эту функцию сомнительной ценности (я думаю, вам не следует), то вы можете также сделать взломы, чтобы фактически использовать “, выглядит как вещь ”. Т.е.,

fromDigits = read . filter (not . (`elem`"[,]")) . show 

Это использует Show экземпляр списков, чтобы обращенного перечень [3,2,1] в реальную строку "[3,2,1]", затем отбрасывает список связанных символов и считывает сцепленную строку "321" обратно, получая номер 321.


Помимо того, что это вообще довольно просто реализовать чистые функции в Haskell ...

+1

Почему не 'fromDigits = read. concatMap show' то? – user3237465

Смежные вопросы