2016-03-03 3 views
1

Я пытаюсь читать п на первой линии, то п строк ввода и печатать сумму первых 2-х элементов из каждой строки, такие как:Haskell: преобразование String -> [Список]

Вход:

2 
1 2 
3 4 

Выход:

3 
7 

до сих пор мой код выглядит следующим образом:

import Control.Monad 

fromDigits = foldl addDigit 0 
where addDigit num d = 10*num + d 

first (x:xs) = fromDigits x 
second (x:xs) = fromDigits xs 

main = interact processInput 
processInput input = unlines [perLine line | line <- lines input] 

perLine line = first line + second line 

но я получаю следующую ошибку

Не удалось соответствовать типу '[Char]' с 'Char'

не может сравниться типа 'Char' с '[String]'

Я новичок в Haskell, поэтому я не уверен, как его решить.

+4

попробуйте написать типы, это поможет в отладке много! – jamshidh

+0

Некоторые подсказки: 'type String = [Char]'. Как вы прочтете строку типа «12 3», чтобы получить ответ «15»? Должно быть что-то, что что-то делает с пробелами. Как вы преобразуете символ типа '7 '' в число, которое вы можете добавить как' 7'? – Cirdec

+1

'interactive' работает только с одной строкой за раз и никогда не останавливается. Вы должны прочитать первую строку, а затем точно количество строк, указанных этой первой строкой, например, с помощью 'readLn >> = flip replicateM getLine'.Тип 'processInput' должен быть' [String] -> [String] ', но' взаимодействовать :: (String -> String) -> IO() '- есть другие ошибки типа, но это, скорее всего, источник один из которых вы специально упомянули. – user2407038

ответ

2

Некоторые намеки, по порядку:

  • В какой-то момент, вы должны преобразовать ваши цифры от Char к Int или тому подобное.
    • Haskell не сделает это за вас, если вы не спросите. Используйте ord.
  • В шаблоне x:xsxs остальная часть списка, а не следующий элемент.
    • Это, скорее всего, из-за проблемы с вашей [Char] против Char.
  • Похоже, что вы хотите рассматривать каждую строку как последовательность слов.
    • Попробуйте использовать функцию words.
  • Наконец, вам необходимо преобразовать ваши номера в форму для печати.
    • Haskell также не сделает это за вас. Используйте show.

В общем, я рекомендую начинать до ghci и играть с ним, только чтобы получить некоторые базовые знания с Haskell. Потяните Hoogle или другую ссылку Haskell в другое окно ...

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