2011-01-13 2 views
1

отредактирован всеhaskell. словам в двоичные числа

Мне нужно преобразовать слова в двоичные числа. С битным помощью твоего я получил это

import Data.Char 


blCo :: String -> String 
blCo xs = concatMap lett2num) xs    

lett2num :: Char -> Int 
lett2num y 
    | (ord 'A' <= ord y) ord 'z') = (ord y - ord 'a') +1 


num2bin :: Int -> String 
num2bin n 
    | n >= 0  = ctive number" 
    where n2b 0 = [] 
     n2b n = n `mod` 2 : n2b (n `div` 2) 

GHC говорит меня mistake.I DonT undertsand это ошибки:

Couldn't match expected type `Char' against inferred type `String' 
In the first argument of `(:)', namely `num2bin (lett2num x)' 
In the expression: num2bin (lett2num x) : blCo xs 
In the definition of `blCo': 
    blCo (x : xs) = num2bin (lett2num x) : blCo xs 
+0

Что это такое '| x: xs' в blCo для? Убери это. – kennytm

+2

Можете ли вы рассказать нам об ошибке, которую дал вам интерпретатор? Когда вы идете к врачу, вы говорите ему, что болит и где, не так ли? –

+0

blCo :: String -> Int blCo x = num2bin (lett2num x) shoud это так? – Tonja

ответ

1

Есть немало ошибок типа здесь, от всего беглого взгляд.

Вы объявили blCo как String -> Integer. Поэтому он берет строку и возвращает целое число. Но аргумент String, x, передается в lett2num, который должен взять символ - это не сработает, и это то, что означает сообщение об ошибке. Возможно, вы имели в виду, чтобы объявить эту линию как

blCo [x] = num2bin(lett2num x) 

так, что x будет соответствовать значению символа в строке на один-персонаже? В любом случае, это то, что вызывает ошибку компилятора - вы передаете String в функцию, ожидающую char.

Кроме того, blCo предполагается вернуть Integer, но возвращаемое значение в целом будет выход num2binнекоторые аргумент) - и эта функция возвращает String, так что это не может работать. Не видя того, что делает lett2bin (и/или ваш подход), я не могу сказать, что не так, но кажется, что что-то, где-то не складывается.

Итак, что это такое - вы пытаетесь вывести String (двоичное представление переданной числовой строки)? Или вы пытаетесь вывести целое число?

+0

В коде нет такой вещи, как lett2num. Существует num2lett, который принимает Int, но не lett2num. –

+0

если бы я понял, что ты прав. мне нужно написать BLCO :: String -> Строка BLCO (х: хз) = num2bin (lett2num х): BLCO хз num2bin :: Int -> Строка – Tonja

+0

Я переиздал все – Tonja

0

1) Пожалуйста, напишите более четкие вопросы, включая ошибку компилятора, если таковая имеется.

2) Пожалуйста, укажите весь ваш код, если это возможно. В этом коде отсутствует lett2num.

3) Некоторые вопросы:

Вам нужно импортировать Data.Char, чтобы получить ord и chr функции:

import Data.Char 

Ваш охранник BLCO бессмысленна, удалите его. Кроме того, это второе определение никогда не будет выполняться, потому что первое всегда совпадает, то есть в blCo xx всегда будет соответствовать вводу. Поэтому вам нужно переписать blCo.

EDIT: Здесь все еще немного неправильно. Я предлагаю вам пойти в IRC и поговорить об этом в режиме реального времени, чтобы вы получили больше понимания в дополнение к правильному коду.

1) типирование для начала: вы вызываете функцию (num2bin), который должен возвращать String и сцепить его в списке с помощью :, который приведет к :: [String]), но хотят, чтобы в конечном итоге только String.Я предполагаю, что вы хотели использовать blCo xs = concatMap (num2bin . lett2num) xs.

2) blCo является рекурсивным в списке, но не определяет, что делать, когда список попадает []. Один из вариантов - переопределить его для использования concatMap, что делает его нерекурсивным.

3) Вы пропустили часть моей точки при импорте Data.Char. Дело в том, чтобы иметь полный код на SO, чтобы люди могли скопировать/вставить ваш код, чтобы помочь вам более легко, а не только то, что вам нужно было на вашей частной копии.

+0

я отредактировал мой пост. и я уже импортировал Data.Char. Я просто не понимаю ошибку, я не понимаю, почему я должен исправить. – Tonja

+0

извините, я не знаю, что такое IRC. и .. так. вы предлагаете мне лучше написать blCo xs = (concatMap num2bin. lett2num) xs, тогда я должен также изменить num2bin :: Int -> [Int] и num2bin n | n> = 0 = reverse (n2b n) – Tonja

+0

Katja: Ой, см. редактирование, я испортил 'blCo xs = concatMap (num2bin. lett2num) xs'. Это не требует никаких изменений в 'num2bin'. IRC - это чат-система (см. Wikipedia), популярный канал [haskell irc] (http://www.haskell.org/haskellwiki/IRC_channel). –

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