Замутки с Haskell
От: Аноним  
Дата: 05.10.09 16:45
Оценка:
Привет всем форумчанам!

Столкнулся с такой проблемой: написать программу на Хаскеле, которая бы подсчитывала количество вхождений заданного числа в массив. Прекрасно понимаю, что задачка детская, на Си или любом другом императивном языке пишется за 5 минут, но вот хоть убей не могу разобраться с ней. Верю, что решение уложится в 3 строчки, но никак. Помогите люди добрые, ибо погибаю...=)
Re: Замутки с Haskell
От: Lloyd Россия  
Дата: 05.10.09 16:57
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Столкнулся с такой проблемой: написать программу на Хаскеле, которая бы подсчитывала количество вхождений заданного числа в массив. Прекрасно понимаю, что задачка детская, на Си или любом другом императивном языке пишется за 5 минут, но вот хоть убей не могу разобраться с ней. Верю, что решение уложится в 3 строчки, но никак. Помогите люди добрые, ибо погибаю...=)


cnt y = length . filter (\x -> x == y)
Re[2]: Замутки с Haskell
От: dvolchek  
Дата: 05.10.09 17:16
Оценка:
Здравствуйте, Lloyd, Вы писали:
L>
L>cnt y = length . filter (\x -> x == y)
L>


Простите пожалуйста мой кретинизм, но можете целую программу написать, очень прошу!!! Вставил ваш кусок в свой код — не работает. Буду очень признателен за помощь. Пусть в качестве массива будут числа [23, 3, 45, 3, 34, 35, 3, 35]. А в качестве сравниваемого числа — число "3". Спасибо что отвечаете на такие глыпые сообщения. =)
Re[3]: Замутки с Haskell
От: nikov США http://www.linkedin.com/in/nikov
Дата: 05.10.09 17:22
Оценка:
Здравствуйте, dvolchek, Вы писали:

D>Простите пожалуйста мой кретинизм, но можете целую программу написать, очень прошу!!! Вставил ваш кусок в свой код — не работает. Буду очень признателен за помощь. Пусть в качестве массива будут числа [23, 3, 45, 3, 34, 35, 3, 35]. А в качестве сравниваемого числа — число "3". Спасибо что отвечаете на такие глыпые сообщения. =)


GHCi, version 6.10.4: http://www.haskell.org/ghc/  :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer ... linking ... done.
Loading package base ... linking ... done.
Prelude> let list = [23, 3, 45, 3, 34, 35, 3, 35]
Prelude> let cnt y = length . filter (\x -> x == y)
Prelude> cnt 3 list
3
Re[3]: Замутки с Haskell
От: Lloyd Россия  
Дата: 05.10.09 17:23
Оценка:
Здравствуйте, dvolchek, Вы писали:

D>Здравствуйте, Lloyd, Вы писали:

L>>
L>>cnt y = length . filter (\x -> x == y)
L>>


D>Простите пожалуйста мой кретинизм, но можете целую программу написать, очень прошу!!! Вставил ваш кусок в свой код — не работает. Буду очень признателен за помощь. Пусть в качестве массива будут числа [23, 3, 45, 3, 34, 35, 3, 35]. А в качестве сравниваемого числа — число "3". Спасибо что отвечаете на такие глыпые сообщения. =)


Я в хаскеле полный профан. Я записал приведенную функцию в файл, сделал в редакторе Haskell->Load File, в окрывшемся окне интерпретатора ввел
cnt 3 [23, 3, 45, 3, 34, 35, 3, 35]

Интерпретатор вывел 3.
Re[4]: Замутки с Haskell
От: dvolchek  
Дата: 05.10.09 17:41
Оценка:
Здравствуйте, Lloyd, Вы писали:
L>Я в хаскеле полный профан. Я записал приведенную функцию в файл, сделал в редакторе Haskell->Load File, в окрывшемся окне интерпретатора ввел
L>
L>cnt 3 [23, 3, 45, 3, 34, 35, 3, 35]
L>

L>Интерпретатор вывел 3.

А как сделать так, чтоб массив был в этом же файле, а программа вызывалась в окне интерпретатора типа как процедура??? Просто мой массив оригинальный состоит где то из 3000 элементов и пихать их каждый раз cnt 3 [и тут эти 3000 элементов] в интерпретатор не айс. =)
Re[5]: Замутки с Haskell
От: nikov США http://www.linkedin.com/in/nikov
Дата: 05.10.09 17:47
Оценка:
Здравствуйте, dvolchek, Вы писали:

D>А как сделать так, чтоб массив был в этом же файле, а программа вызывалась в окне интерпретатора типа как процедура??? Просто мой массив оригинальный состоит где то из 3000 элементов и пихать их каждый раз cnt 3 [и тут эти 3000 элементов] в интерпретатор не айс. =)


Пишем в GHCi:
:e data.hs


Открывается файл. В нем пишем:
list = [23, 3, 45, 3, 34, 35, 3, 35] -- Put 3000 elements here


Сохраняем, закрываем. Потом в GHCi:
:l data.hs


Он отвечает:
[1 of 1] Compiling Main             ( data.hs, interpreted )
Ok, modules loaded: Main.
*Main>


Потом спрашиваем, что нужно.
Re[5]: Замутки с Haskell
От: Lloyd Россия  
Дата: 05.10.09 17:51
Оценка:
Здравствуйте, dvolchek, Вы писали:

D>А как сделать так, чтоб массив был в этом же файле, а программа вызывалась в окне интерпретатора типа как процедура??? Просто мой массив оригинальный состоит где то из 3000 элементов и пихать их каждый раз cnt 3 [и тут эти 3000 элементов] в интерпретатор не айс. =)


что-то типа:

processArr = cnt 3 [массив]
Re[6]: Замутки с Haskell
От: dvolchek  
Дата: 05.10.09 17:59
Оценка:
Спасииииибо! Вам гигнатское, то над чем я мучался последние 7 часов без перерыва!!! Спасибо!!!!
Re[6]: Замутки с Haskell
От: dvolchek  
Дата: 05.10.09 18:00
Оценка:
Спасииииибо! Вам гигнатское, то над чем я мучался последние 7 часов без перерыва!!! Спасибо!!!!
Re[2]: Замутки с Haskell
От: deniok Россия  
Дата: 06.10.09 06:17
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>
L>cnt y = length . filter (\x -> x == y)
L>


Вместо лямбды можно использовать сечение
cnt y = length . filter (== y)
Re[3]: Замутки с Haskell
От: BulatZiganshin  
Дата: 06.10.09 12:18
Оценка:
Здравствуйте, deniok, Вы писали:

D>Вместо лямбды можно использовать сечение


т.е. секцию
Люди, я люблю вас! Будьте бдительны!!!
Re[4]: Замутки с Haskell
От: geniepro http://geniepro.livejournal.com/
Дата: 06.10.09 14:52
Оценка:
Здравствуйте, BulatZiganshin, Вы писали:

BZ>Здравствуйте, deniok, Вы писали:


D>>Вместо лямбды можно использовать сечение


BZ>т.е. секцию


Скорее частичное применение
Re[4]: Замутки с Haskell
От: deniok Россия  
Дата: 06.10.09 15:32
Оценка:
Здравствуйте, BulatZiganshin, Вы писали:

BZ>Здравствуйте, deniok, Вы писали:


D>>Вместо лямбды можно использовать сечение


BZ>т.е. секцию


Когда я переводил GIH было обсуждение и вроде решили, что все-таки наиболее адекватно сечение
Автор: Трурль
Дата: 07.12.06
.
Re[5]: Замутки с Haskell
От: BulatZiganshin  
Дата: 07.10.09 11:26
Оценка:
Здравствуйте, deniok, Вы писали:

D>>>Вместо лямбды можно использовать сечение


BZ>>т.е. секцию


D>Когда я переводил GIH было обсуждение и вроде решили, что все-таки наиболее адекватно сечение
Автор: Трурль
Дата: 07.12.06
.


это не перевод section, а другой термин для того же явления
Люди, я люблю вас! Будьте бдительны!!!
Re[2]: Замутки с Haskell
От: Кодт Россия  
Дата: 08.10.09 10:31
Оценка: 6 (1)
Здравствуйте, Lloyd, Вы писали:

L>
L>cnt y = length . filter (\x -> x == y)
L>


Попробовал в point-free выразить. Ибо (\x->x==y) можно записать короче: (==y) — или (y==), в силу коммутативности ==.
Итог: (length.).(filter.(==))
... << RSDN@Home 1.2.0 alpha 4 rev. 1237>>
Перекуём баги на фичи!
Re[3]: Замутки с Haskell
От: nikov США http://www.linkedin.com/in/nikov
Дата: 08.10.09 10:35
Оценка: +1
Здравствуйте, Кодт, Вы писали:

К>Попробовал в point-free выразить. Ибо (\x->x==y) можно записать короче: (==y) — или (y==), в силу коммутативности ==.

К>Итог: (length.).(filter.(==))

Точка ассоциативна, поэтому можно просто:
(length.).filter.(==)
Re[3]: Замутки с Haskell
От: Lloyd Россия  
Дата: 09.10.09 14:21
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Попробовал в point-free выразить. Ибо (\x->x==y) можно записать короче: (==y) — или (y==), в силу коммутативности ==.

К>Итог: (length.).(filter.(==))

Кажется, точка лишняя затесалась.
Re[4]: Замутки с Haskell
От: deniok Россия  
Дата: 09.10.09 14:31
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>Здравствуйте, Кодт, Вы писали:


К>>Попробовал в point-free выразить. Ибо (\x->x==y) можно записать короче: (==y) — или (y==), в силу коммутативности ==.

К>>Итог: (length.).(filter.(==))

L>Кажется, точка лишняя затесалась.


Не, всё верно
filter . (==) :: a -> ([a] -> [a])
(length .) :: (b -> [c]) -> b -> Int

При их композиции унификация дает уравнение
b -> [c] = [a] -> [a]

откуда
b = [a]
c = a

то есть
(length .) . (filter . (==)) :: a -> [a] -> Int

что и требовалось. (Контекст (Eq a) => поскипан для ясности)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.