2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу 1, 2  След.
 
 Haskell. Перевод Char в Int
Сообщение16.06.2015, 11:30 


16/12/14
472
Собственно изучая Haskell наконец-то добрался в учебнике до места, где я смог организовывать ввод/вывод (глава про монады), но я решил что для лучшего понимание стоит уже начать самому баловаться с компилятором потихоньку. И тут случилась такая коллизия: Я совершенно не знаю а как преобразовывать тип Char в тип Int в рамках данного языка, то есть у меня нет идей для такой функции: Char -> Int. По идее такая должна быть в стандартном наборе, однако нормальной документации я так и не нашел.

P.S. И еще не могли бы посоветовать интерпретатор для Haskell? (Работать с компилятором конечно можно, но все-таки хотелось бы увидеть выполнение в интерпретаторе)

 Профиль  
                  
 
 Re: Haskell. Перевод Char в Int
Сообщение16.06.2015, 11:47 
Заслуженный участник
Аватара пользователя


06/10/08
6422
Тип Char является представителем класса Enum, так что есть функция fromEnum. У нее есть синоним ord в модуле Data.Char. Документация тут: https://www.haskell.org/onlinereport/ha ... 13-1160006 и тут: https://www.haskell.org/onlinereport/ha ... 21600016.5
Haskell Report писал(а):
Type Char is an instance of the classes Read, Show, Eq, Ord, Enum, and Bounded. The toEnum and fromEnum functions, standard functions from class Enum, map characters to and from the Int type.

Есть поисковик по основным библиотекам Haskell: https://www.haskell.org/hoogle/?hoogle=Char+-%3E+Int , пользуйтесь.

Под интерпретатором Вы имеете в виду командную строку, чтобы можно было писать туда выражения и они вычислялись? В состав GHC входит GHCi.

 Профиль  
                  
 
 Re: Haskell. Перевод Char в Int
Сообщение16.06.2015, 14:44 


16/12/14
472
Возникла такая проблема: я не понимаю где допускаю ошибку в данном коде:
код: [ скачать ] [ спрятать ]
Используется синтаксис Haskell
module Main where
import Data.Char

quickSort :: [a] -> [a]
quickSort [] = []
quickSort (x:xs) = [y | y <- xs, y < x] ++ [x] ++ [y | y <- xs, y > x]

doing :: [IO()] -> IO()
doing [] = return ()
doing (x:xs) = do x doing xs

putstring :: String -> IO()
putstring line = doing (map putChar line)

getstring :: IO String
getstring = do a <- getChar if a == '\n' then return ""
            else do as <-  getstring
            return (a:as)

main :: IO()
main = do ls <- getstring
          putstring(map chr quickSort(map digitToInt ls))

Компилятор пишет ошибку при вводе "if" -> скорее всего я не правильно определил функцию, которая считывает строчку (getstring). Мне кажется, что не совсем правильно описано сравнение а с символом переноса строки, так как все-таки a - результат некоторого действия (предположение), а не чистый char. Можете подсказать что тут не так?

P.S. Как вы поняли - это коротенькая программка, которая считывает список и выводит его отсортированный вариант.

 Профиль  
                  
 
 Re: Haskell. Перевод Char в Int
Сообщение16.06.2015, 15:06 
Заслуженный участник
Аватара пользователя


06/10/08
6422
Ну там же a <- getChar это одно выражение, а if ... уже другое. Должен быть перевод строки или точка с запятой, и потом еще else надо выровнять как положено.

-- Вт июн 16, 2015 14:12:18 --

То же самое в doing, там должен быть перевод строки или точка с запятой после x. И вообще, Ваше doing это стандартная функция sequence_, putstring - это putStr, а getstring - это getLine. Или так и задумано?

И зачем вам здесь вообще преобразования из Char в Int и обратно? Char - экземпляр класса Ord, его можно просто так сравнивать.

 Профиль  
                  
 
 Re: Haskell. Перевод Char в Int
Сообщение16.06.2015, 15:15 


16/12/14
472
Xaositect
Ну функции дублировал намеренно, чтобы не просто пользоваться всем готовым, а так сказать пощупать, а вот про то что char можно сравнивать - не подумал.

 Профиль  
                  
 
 Re: Haskell. Перевод Char в Int
Сообщение16.06.2015, 15:19 
Заслуженный участник
Аватара пользователя


06/10/08
6422
И на сигнатуру вашего quickSort компилятор будет ругаться, ибо там есть сравнения элементов типа a, значит, должно быть ограничение Ord a. (и сортировка, кстати, не quick, но это Вы оставьте на потом)

 Профиль  
                  
 
 Re: Haskell. Перевод Char в Int
Сообщение16.06.2015, 22:21 
Заслуженный участник


27/04/09
28128
Про поисковые системы: Xaositect уже показал Hoogle, а ещё есть Hayoo — там, вроде, охват побольше. Обе имеют поисковые плагины для браузеров, а ещё можно поставить через Cabal программки, вызываемые из командной строки (и потому легко прямо из GHCi). Ну и сам GHCi может показать информацию об имени из импортированного в данное время модуля: :i name, а ещё можно узнать тип выражения :t expr и kind типа :t type-expr. Ещё полезно включать многострочный ввод: :set +m, а то иначе придётся заменять все отступы на { ; }, что для длинных определений неудобно (хотя их проще засунуть в файл и импортировать). А так там вообще много чего ещё, посмотрите потом справку.

 Профиль  
                  
 
 Re: Haskell. Перевод Char в Int
Сообщение17.06.2015, 12:02 


16/12/14
472
А синтаксис Haskell позволяет вкладывать охрану в охрану?

 Профиль  
                  
 
 Re: Haskell. Перевод Char в Int
Сообщение17.06.2015, 23:42 
Заслуженный участник


27/04/09
28128
Не пойму, чем это нужнее связки условий операцией && (и какая у этого семантика, если не угадал сейчас). Можете пояснить примером? (Сделайте такой возможный синтаксис, какой хотите, если понадобится.)

 Профиль  
                  
 
 Re: Haskell. Перевод Char в Int
Сообщение17.06.2015, 23:50 


16/12/14
472
arseniiv
Простите уже не могу - в процессе размышлений уже нашел другое более короткое и на мой взгляд красивое решение (а так мне просто визуально нравится охрана и сопоставление с образцом, а к if then else менее тяготею).
Вообще, изучая Haskell, я чувствую себя очень комфортно - мне очень понравилась функциональная парадигма программирования, я собственно вообще тяготел к функциональным решениям даже в рамках Python, с которого начался мой путь в мире программирования, но я довольно быстро устал от ООП (оно мне показалось скучным), а теперь изучая хаскель и необходимую математику ловлю интерес и удовольствие.

 Профиль  
                  
 
 Re: Haskell. Перевод Char в Int
Сообщение18.06.2015, 00:01 
Заслуженный участник


27/04/09
28128
Pulseofmalstrem в сообщении #1028325 писал(а):
Простите уже не могу - в процессе размышлений уже нашел другое более короткое и на мой взгляд красивое решение
OK.

Pulseofmalstrem в сообщении #1028325 писал(а):
а к if then else менее тяготею
Кстати, некоторые считают, что этот сахар вполне заменила бы обычная функция, которую для совместимости с maybe и either притом стоило бы звать bool. (В любом случае, такая функция неплоха, и её с какой-то версии ввели в Data.Bool, насколько помню. Ага, вот.)

Pulseofmalstrem в сообщении #1028325 писал(а):
но я довольно быстро устал от ООП (оно мне показалось скучным)
Но вы потом вернитесь к какому-нибудь отличному от изучавшихся языку с ООП, может быть польза. Потом можете на Ceylon, скажем, взглянуть. (Реклама, реклама.) Ну, когда решите, что время для чего-то дополнительного нового.

 Профиль  
                  
 
 Re: Haskell. Перевод Char в Int
Сообщение19.06.2015, 02:48 


05/09/12
2587
arseniiv Вы сами, насколько я помню, в основном используете С# и восторженно отзываетесь о Ceylon. А какие ООП языки считаете интересными в плане знакомства с парадигмой? Думаю, не С++. Smalltalk? Мне после трудного постижения азов Haskell свой собственный Liscript даже нравится, как и остальные не Common лиспы, от Scheme до Clojure.

 Профиль  
                  
 
 Re: Haskell. Перевод Char в Int
Сообщение20.06.2015, 04:03 
Заслуженный участник


27/04/09
28128

(Оффтоп)

Я сам, увы, пишу на чём-нибудь с устрашающей стохастичностью. И успеваю даже забывать полезные вещи. Так что «в основном» не могу счесть применимым. А дальше…

_Ivana в сообщении #1028751 писал(а):
Думаю, не С++. Smalltalk?
Вот со вторым знаком на уровне «слышал три раза и ещё два», так что ничего сказать не могу. (А вот из-за вскрывшегося для меня недавно крутого нрава C по части определений я даже его как процедурный или как там его язык не могу теперь с чистой совестью советовать, а C++ как какой угодно тем более.) CL я бы советовал за мультиметоды, но тоже не знаком (но один знакомый (в обоих смыслах) человек нахваливает регулярно :-) ). Ceylon не могу советовать из-за того, что он по меркам довольно большого числа людей, скорее всего, ещё не совсем на ногах. C# имеет свои минусы. Такой вот ответ без конкретности.

P. S. Ну и вообще я большого количества интересных языков, как можно догадаться, не знаю. :roll:

 Профиль  
                  
 
 Re: Haskell. Перевод Char в Int
Сообщение20.06.2015, 09:38 


11/12/14
893

(Оффтоп)

arseniiv в сообщении #1029044 писал(а):
А вот из-за вскрывшегося для меня недавно крутого нрава C по части определений я даже его как процедурный или как там его язык не могу теперь с чистой совестью советовать

Это что вдруг? Это из-за темы про специфику дефиниций сложных типов "по месту"? Ну право, это же фигня, а не вопрос.

 Профиль  
                  
 
 Re: Haskell. Перевод Char в Int
Сообщение21.06.2015, 23:16 
Заслуженный участник


27/04/09
28128

(Оффтоп)

Вопрос-то теперь, с имеющимися ответами, действительно фигня (и спасибо за ответы ещё раз), но это всё-таки неприлично. Авторы могли потянуть несколько месяцев с выпуском компилятора, документации и всего остального и чуть довести язык. :-) Хотя, конечно, тогда было меньше разнообразной информации о языках программирования, так что я сейчас предлагаю некорректно (как укорять Аристотеля в том, что он не открыл КТП вместе со всеми нужными для этого вещами). Но поворчать-то хочется…

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 16 ]  На страницу 1, 2  След.

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group