2015-07-24 4 views
0

У меня возникли проблемы с упражнением:Haskell CONCAT Int

я должен сделать функцию с именем addDigit, которая принимает два Int, второй один находится в интервале от 0 до 9, и возвращает Int, который является первым Int а затем второй.

Пример:

вход: addDigit (-123) 4

выход: -1234

то, что я попытался следующий:

addDigit :: Int -> Int -> Int 
addDigit x y = x ++ y 

я получаю это не работает, потому что ++ ключевое слово работает только со строками, символами и списками (я думаю), и это должно быть разрешено простым способом, не меняя Int's на Stri ngs или любые другие переменные, но я вообще не знаю, как это сделать.

+2

Посмотрите, что произойдет, когда вы умножаете число на 10 ... – luqui

+1

Просто, чтобы уточнить функцию (++): она работает только со списками. Строки - это списки символов, поэтому он работает со строками. – hdgarrood

ответ

6

Вы пытаетесь решить проблему графически (считая целые числа как строки), вы хотите рассматривать ее как численную проблему. Для положительных значений добавление цифры выполняется с помощью следующей функции.

addDigitPositive a b = 10 * a + b 

Это будет, к сожалению, не работать, если a < 0. При таких обстоятельствах нам пришлось бы вычестьb. Мы можем легко интегрировать эту функцию с защитой функций.

addDigit a b | a < 0  = a * 10 - b 
      | otherwise = a * 10 + b 
-2

Или вы могли бы решить графически, путем преобразования чисел в строки с помощью show, а затем конкатенация их с (++):

addDigit :: Int -> Int -> String 
addDigit x y = (show x) ++ (show y) 

Теперь, если вы все еще хотите Int, как выход, вы можете преобразовать строку в Int с помощью read:

addDigit :: Int -> Int -> Int 
addDigit x y = read ((show x) ++ (show y)) 

Как вы можете видеть, есть больше чем один способ кожи кошки.

Надеюсь, это поможет.

+2

Прошу прощения, в частности, сказал, что ему не нужно решение, которое включало «изменение Ints to Strings». – Kwarrtz