Столкнулся с такой проблемой: написать программу на Хаскеле, которая бы подсчитывала количество вхождений заданного числа в массив. Прекрасно понимаю, что задачка детская, на Си или любом другом императивном языке пишется за 5 минут, но вот хоть убей не могу разобраться с ней. Верю, что решение уложится в 3 строчки, но никак. Помогите люди добрые, ибо погибаю...=)
Здравствуйте, Аноним, Вы писали:
А>Столкнулся с такой проблемой: написать программу на Хаскеле, которая бы подсчитывала количество вхождений заданного числа в массив. Прекрасно понимаю, что задачка детская, на Си или любом другом императивном языке пишется за 5 минут, но вот хоть убей не могу разобраться с ней. Верю, что решение уложится в 3 строчки, но никак. Помогите люди добрые, ибо погибаю...=)
Простите пожалуйста мой кретинизм, но можете целую программу написать, очень прошу!!! Вставил ваш кусок в свой код — не работает. Буду очень признателен за помощь. Пусть в качестве массива будут числа [23, 3, 45, 3, 34, 35, 3, 35]. А в качестве сравниваемого числа — число "3". Спасибо что отвечаете на такие глыпые сообщения. =)
Здравствуйте, 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
Здравствуйте, 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, в окрывшемся окне интерпретатора ввел
Здравствуйте, Lloyd, Вы писали: L>Я в хаскеле полный профан. Я записал приведенную функцию в файл, сделал в редакторе Haskell->Load File, в окрывшемся окне интерпретатора ввел L>
L>cnt 3 [23, 3, 45, 3, 34, 35, 3, 35]
L>
L>Интерпретатор вывел 3.
А как сделать так, чтоб массив был в этом же файле, а программа вызывалась в окне интерпретатора типа как процедура??? Просто мой массив оригинальный состоит где то из 3000 элементов и пихать их каждый раз cnt 3 [и тут эти 3000 элементов] в интерпретатор не айс. =)
Здравствуйте, 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>
Здравствуйте, dvolchek, Вы писали:
D>А как сделать так, чтоб массив был в этом же файле, а программа вызывалась в окне интерпретатора типа как процедура??? Просто мой массив оригинальный состоит где то из 3000 элементов и пихать их каждый раз cnt 3 [и тут эти 3000 элементов] в интерпретатор не айс. =)
Здравствуйте, deniok, Вы писали:
D>>>Вместо лямбды можно использовать сечение
BZ>>т.е. секцию
D>Когда я переводил GIH было обсуждение и вроде решили, что все-таки наиболее адекватно сечение
Здравствуйте, Кодт, Вы писали:
К>Попробовал в point-free выразить. Ибо (\x->x==y) можно записать короче: (==y) — или (y==), в силу коммутативности ==. К>Итог: (length.).(filter.(==))
Здравствуйте, Кодт, Вы писали:
К>Попробовал в point-free выразить. Ибо (\x->x==y) можно записать короче: (==y) — или (y==), в силу коммутативности ==. К>Итог: (length.).(filter.(==))
Здравствуйте, 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) => поскипан для ясности)