Операторы в Haskell с порядком 'x' - PullRequest
0 голосов
/ 01 мая 2018
import Data.Char  
x1 xs = sum(map (hilfsfunction) xs)
hilfsfunction x  
   | (ord 'x' > 97 && ord 'x' < 107) = (ord 'x' - 96)  
   | (ord 'x' > 48 && ord 'x' < 58) = (ord 'x' - 48)  
   | otherwise = 0  

Мне нужно написать программу, в которой функция берет строку, а затем делает с ней следующие вещи:
- Если буква a, измените ее на 1
- Если письмо - что-то еще, я должен взять для него эквивалентное число. - Все остальные символы должны быть изменены на 0

Моя проблема сейчас в том, что каждый раз, когда я запускаю эту программу, сумма равна 0, независимо от того, истинен ли первый или второй случай.

Пример: давайте возьмем «6»:

*Main Data.Char> ord '6' > 48 && ord '6' < 58
True

после этого:

*Main Data.Char> ord '6' - 48
6

но если я возьму свою функцию, каждый раз так будет ....:

*Main Data.Char> x1 "6"
[0]

Я не знаю, где моя ошибка.

Ответы [ 2 ]

0 голосов
/ 02 мая 2018

В сумме потеря информации. Первый '0' не входит. Во-вторых, диапазон ['1'..'9'] и ['a'..'i'] одинаков в сумме.

Кроме того, если бы я собирался написать это, я бы

import Data.Char (ord)
sol x | elem x ['0'..'9'] = mod (ord x) 16
      | elem x ['a'..'z'] = mod (ord x) 32
      | elem x ['A'..'Z'] = mod (ord x) 64
      | otherwise = 0

Этим можно продемонстрировать предшествующие факты

sol 'd' produces 4
sol '4' produces 4
sol '@' produces 0
sol '0' produces 0

Теперь, когда сказано, ord - это индекс в наборе символов ASCII. Можно создать свой собственный индекс только с теми символами, которые вас интересуют.

tlz = zip [1..] $ concat [['0'..'9'],['a'..'z']]

Тогда вы можете искать символы, и каждый из них будет иметь уникальный индекс, даже ноль «0» будет зарегистрирован как один. Если символа нет в таблице, он просто не засчитывается. Сжатие списка просто выдает ноль [].

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

smmat = sum.concat.map (\x->[a|(a,b)<-tlz,x == b])

Просто напишите ему список.

smmat "This is 42% sure"

226

Будьте уверены, в предыдущем списке было 11 "попаданий". выньте sum из списка, чтобы увидеть или измените a в списке, чтобы увидеть символы b.

0 голосов
/ 01 мая 2018

Здесь вы жестко закодировали символ 'x' вместо , используя переменную x :

import Data.Char  
x1 xs = sum(map (hilfsfunction) xs)
hilfsfunction x  
   | (ord <b>'x'</b> > 97 && ord <b>'x'</b> < 107) = (ord <b>'x'</b> - 96)  
   | (ord <b>'x'</b> > 48 && ord <b>'x'</b> < 58) = (ord <b>'x'</b> - 48)  
   | otherwise = 0

Так что это означает, что Haskell не заботится о значении x: он просто использует 'x'.

Обратите внимание, что здесь вы пишете довольно загадочную функцию, вы можете написать ее более понятным способом, сравнивая ее с другими символами, и использовать ord при выполнении арифметики:

hilfsfunction :: Char -> Int
hilfsfunction x  
   | <b>'a'</b> <= <b>x</b> && <b>x</b> <= <b>'z'</b> = ox - ord 'a' + 1
   | <b>'0'</b> <= <b>x</b> && <b>x</b> <= <b>'9'</b> = ox - ord '0'
   | otherwise = 0
    <b>where ox = ord x</b>

Здесь на первый взгляд (без каких-либо знаний об общих чертах ASCII) ясно, что вы сначала проверяете, находится ли x в диапазоне ['a'..'z'], и если это так, вы в основном используете его порядковый номер. Если нет, вы проверяете, находится ли он в диапазоне ['0' .. '9'], а затем используете его числовой аналог, а в противном случае вы возвращаете 0. Фактически вы допустили ошибку в своей реализации, поскольку ord 'z' - это 122, а не 107. Хотя вы можете использовать 122, сравнивая с 'z', вы, вероятно, с меньшей вероятностью допустите ошибки, поскольку вы позволяете Haskell переводить символы в эквивалент кода ASCII.

С новым определением для hilsfsfunction мы получаем:

Prelude Data.Char> x1 "6aa@a1a~dwfwf123"
79
...