Форум программистов, компьютерный форум, киберфорум
Haskell
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
33 / 59 / 6
Регистрация: 22.01.2017
Сообщений: 640

Баловство с Haskell

07.07.2018, 00:37. Показов 1614. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Осилил главу книги, и решил написать свою программку. После крика GHCI о том, что он не умеет сравнивать мой собственный тип, я решил создать экземпляр класса Eq для него и...
Haskell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
module Test where
 
data Male = Man | Woman
 
male2 :: Male
male2 = Woman
 
instance Eq Male where
    (==) :: if Male -- Хм, что бы тут написато то... Male == Woman явно не прокатит.
 
fun :: Male -> String
fun a = if a == Woman
        then "Woman"
        else "Man"
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
07.07.2018, 00:37
Ответы с готовыми решениями:

Место ФП и Haskell в компьютерной индустрии (Для чего он нужен, этот Haskell?)
"У нас" ? А где преподавание этой экзотики на высоте? Добавлено через 2 минуты А где такие "пришедшие" используют...

Haskell
Ищу хаскелиста. Работа над серверной частью ERP системы. Кто заинтересовался писать на почту fclaw007@gmail.com или в личку

HASKELL
Добрый вечер, прошу помощи у знающих Haskell, не понимаю его, не для меня видимо, но сдать дисциплину надо, не хотелось бы вылететь с...

10
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38173 / 21108 / 4307
Регистрация: 12.02.2012
Сообщений: 34,707
Записей в блоге: 14
07.07.2018, 09:17
Haskell
1
2
3
4
5
6
7
module Test where
 
data Male = Man | Woman  deriving (Eq,Show)
 
fun :: Male -> String
fun Man = "Man"
fun Woman = "Woman"
4
Модератор
 Аватар для Curry
5158 / 3482 / 536
Регистрация: 01.06.2013
Сообщений: 7,549
Записей в блоге: 9
07.07.2018, 09:22
Лучший ответ Сообщение было отмечено Luke0208 как решение

Решение

Haskell
1
2
3
4
instance Eq Male where
    Man   == Man   = True
    Woman == Woman = True
    _     == _     = False
Но, обычно дают компилятору самому сделать такие инстансы
Haskell
1
2
data Male = Man | Woman
        deriving(Eq,Show)
Заодно, функция show для Male будет тоже что ваша fun.
3
33 / 59 / 6
Регистрация: 22.01.2017
Сообщений: 640
07.07.2018, 12:21  [ТС]
Haskell
1
 _     == _     = False
А что определяет данная запись? Если неважно_что равно неважно_что выдать False? Как тогда при сравнении Man == Woman оно выдает False, если они не равны? Не должно быть (хотя интерпретатор не сьел)
Haskell
1
_  /= _ = Falsе
0
Модератор
 Аватар для Curry
5158 / 3482 / 536
Регистрация: 01.06.2013
Сообщений: 7,549
Записей в блоге: 9
07.07.2018, 12:40
Цитата Сообщение от Luke0208 Посмотреть сообщение
Если неважно_что равно неважно_что выдать False?
Нет. Функцию проверки на равенство (==) мы здесь и определяем.
Если первые два варианта (строки 2 и 3) не подходят, то для любых оставшихся вариантов значений аргументов = False.
1
33 / 59 / 6
Регистрация: 22.01.2017
Сообщений: 640
07.07.2018, 12:50  [ТС]
Это то самое сопостовление с образцом? Оно все таки последовательное? И, как комплиятор могет в deriving, больно умный какой то)
0
Модератор
 Аватар для Curry
5158 / 3482 / 536
Регистрация: 01.06.2013
Сообщений: 7,549
Записей в блоге: 9
07.07.2018, 13:00
Цитата Сообщение от Luke0208 Посмотреть сообщение
Это то самое сопостовление с образцом? Оно все таки последовательное?
да.
Цитата Сообщение от Luke0208 Посмотреть сообщение
И, как комплиятор могет в deriving, больно умный какой то)
Он ещё и не то могёт! Голова!
3
Эксперт функциональных языков программированияЭксперт по математике/физике
4313 / 2105 / 431
Регистрация: 19.07.2009
Сообщений: 3,204
Записей в блоге: 24
08.07.2018, 12:19
Я тоже вставлю пятак ради прояснения некоторых моментов, возможно, интересных ТС.
Цитата Сообщение от Luke0208 Посмотреть сообщение
Это то самое сопостовление с образцом? Оно все таки последовательное?
Сопоставление происходит последовательно и на этом может быть завязана некоторая логика.
К примеру, пусть есть декартово произведение из сумм и одноаргументная функция:
Haskell
1
2
3
4
5
6
7
8
9
data Pair a b = Pair a b
u :: Either Int String -> Int -> Int
v :: Int -> Either Int String -> Int
w :: Int
 
f :: Pair (Either Int String) (Either Int String) -> Int
f (Pair x (Left y)) = u x y
f (Pair (Left x) y) = v x y
f _ _ = w
Если первые две строки поменять местами, изменится логика работы f (Left x) (Left y), разве что только не выполняется u (Left x) y = v x (Left y).
Последняя строка является применом частоупотребляемой идеомы
Haskell
1
f _ _ … _ =
которая читается «во всех остальных случаях f равна».
1
Антикодер
Эксперт функциональных языков программирования
1888 / 870 / 48
Регистрация: 15.09.2012
Сообщений: 3,088
08.07.2018, 13:19
Первое что нужно было сделать - посмотреть на тип (==):
Haskell
1
2
3
4
5
6
7
8
ghci> :t (==)
(==) :: Eq a => a -> a -> Bool
ghci> :i (==)
class Eq a where
  (==) :: a -> a -> Bool
  ...
    -- Defined in ‘GHC.Classes’
infix 4 ==
Это означает:
Haskell
1
a -> a -> Bool
На месте "a" может быть любой тип(параметрический полиморфизм)
Haskell
1
Eq a =>
На месте "a" может быть не любой тип, а только тот который имеет "instance Eq" (специальный полиморфизм).

Наверно с полиморфизма как раз начинается это порог вхождения в Haskell... В Haskell-е эта гора, к которой вы пытаетесь подступиться, выше чем в других языках. Но бояться не стоит.

На символ "_" нужно смотреть шире, эту штуку можно также ставить после знака "=", чтобы компилятор подсказал, что туда можно поставить, пример:
Haskell
1
2
3
4
5
6
7
8
9
10
ghci> x = _ 1
 
<interactive>:4:5: error:
    • Found hole: _ :: Integer -> t
      Where: ‘t’ is a rigid type variable bound by
               the inferred type of x :: t at <interactive>:4:1
    • In the expression: _
      In the expression: _ 1
      In an equation for ‘x’: x = _ 1
    • Relevant bindings include x :: t (bound at <interactive>:4:1)
Тут компилятор говорит, что вместо "hole _" нужна функция типа (Integer -> t) где t - любой тип. В этом примере это очевидно, но в более сложных конструкциях, это бывает полезно.
То есть на интуитивном уровне - это всё что угодно.

Послесловие:
Посмотрите курсы Дениса Москвина:
Полезные ссылки по Haskell
По одной только книге сложно разобраться, много моментов, когда нужен человек, который будет показывать, как это всё делать.
Ну и материал нужно закреплять решением задач.
1
Эксперт функциональных языков программированияЭксперт по математике/физике
4313 / 2105 / 431
Регистрация: 19.07.2009
Сообщений: 3,204
Записей в блоге: 24
08.07.2018, 14:48
У меня не получилось. Хотя ИМХО контекстный вывод типов скорее тема IDE.
Haskell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
GHCi, version 7.6.3: http://www.haskell.org/ghc/  :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
Prelude> :t _
 
<interactive>:1:1: Pattern syntax in expression context: _
Prelude> :t \x -> _
 
<interactive>:1:7: Pattern syntax in expression context: _
Prelude> x = _ 1
 
<interactive>:4:3: parse error on input `='
Prelude> let x = _ 1
 
<interactive>:5:9: Pattern syntax in expression context: _
1
Антикодер
Эксперт функциональных языков программирования
1888 / 870 / 48
Регистрация: 15.09.2012
Сообщений: 3,088
09.07.2018, 00:18
ну дык у меня GHCi, version 8.0.2, там и информация об ошибках понятнее стала.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
09.07.2018, 00:18
Помогаю со студенческими работами здесь

Задачка Haskell
День добрый! Нужно реализовать данное задание на HUGS-98, без использования стандартных функций. Ha oтрезке oпредeлить чиcлo с...

Задачки по Haskell
Определить последовательность, в которой каждый элемент — список всех простых делителей соответствующего целого числа. У меня генерирует...

Массивы в Haskell
У меня возникла такая проблемма. Нужно на Haskell, написать программу, которая находит нужный массив и удаляет его. Прошу помочь. Зараннее...

Декларативность в Haskell
Я новичок в Haskell и хочу спросить про декларативность. Не очень понимаю определение данного термина, сказано, что при декларативном...

Haskell Tuples
Добрый день, вообще не могу разобраться как сделать задачу.. Помогите пожалуйста используя unzip Есть список из tuples: нужно на...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru