Форум программистов, компьютерный форум, киберфорум
Haskell
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.80/15: Рейтинг темы: голосов - 15, средняя оценка - 4.80
 Аватар для programm1r
48 / 47 / 7
Регистрация: 19.06.2012
Сообщений: 134

Сравнивая элементы двух списков вернуть пару первых не равных элементов

05.07.2012, 18:57. Показов 3108. Ответов 21
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет! Сравнивая элементы двух списков вернуть пару первых не равных элементов
Haskell
1
2
3
4
f1 :: Ord a => [a] -> [a] -> (a,a)
f1 [] _ = error "First argument is empty list."
f1 _ [] = error "Second argument is empty list."
f1 (x:xs) (y:ys) = if x /= y then (x,y) else f1 xs ys
в мозг не умещается как остановиться и вернуть значение

Добавлено через 1 час 20 минут
Всем спасибо, вопрос снят. Оказалось просто... Хотя интересно было бы посмотреть на варианты.

Добавлено через 11 минут
Глючит
Haskell
1
2
3
>> f1 [1,1,1] [1,1,1]
*** Exception: First argument is empty list.
>>
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
05.07.2012, 18:57
Ответы с готовыми решениями:

Найти количество равных элементов в первых двух строках матрицы
В каждом задании предполагается, что заданы две целые квадратные матрицы С и Т порядка n 2<=n<=10 Если количество равных элементов...

Определить количество равных элементов в первых двух строках матрицы
Если количество равных элементов в первых двух строках матрицы C больше количества равных чисел в последних двух строках матицы T, то найти...

Вычислить,сколько в матрице различных элементов; двух равных,трёх равных и т.д
Есть задача Вычислить,сколько в матрице различных элементов; двух равных,трёх равных и т.д Помогите решить... Добавлено через 7...

21
 Аватар для calabi-yau
78 / 64 / 5
Регистрация: 25.03.2012
Сообщений: 71
05.07.2012, 20:24
Haskell
1
2
3
4
5
import Data.List 
 
f :: Eq a => [a] -> [a] -> Maybe (a,a)
f = 
  (find (uncurry (/=)) .) . zip
0
 Аватар для programm1r
48 / 47 / 7
Регистрация: 19.06.2012
Сообщений: 134
05.07.2012, 21:33  [ТС]
calabi-yau спасибо. Пока сделал так:
Haskell
1
2
3
4
f1 :: (Eq a) => [a] -> [a] -> Maybe (a,a)
f1 [] _ = Nothing
f1 _ [] = Nothing
f1 (x:xs) (y:ys) = if x /= y then Just(x,y) else f1 xs ys
Добавлено через 7 минут
Думаю чем меньше функций, тем проще и быстрее. В принципе все устраивает, но интересно какие еще варианты могут быть?

Добавлено через 41 минуту
А если эти два списка надо обработать начиная с конца?
0
 Аватар для Сtrl
144 / 134 / 8
Регистрация: 19.07.2011
Сообщений: 184
06.07.2012, 05:31
Цитата Сообщение от programm1r Посмотреть сообщение
А если эти два списка надо обработать начиная с конца?
Функция reverse же есть.
0
 Аватар для programm1r
48 / 47 / 7
Регистрация: 19.06.2012
Сообщений: 134
06.07.2012, 09:01  [ТС]
Где можно на русском почитать о том как внутренне устроены списки в haskell? На уровне компилятора.
Цитата Сообщение от Сtrl Посмотреть сообщение
Функция reverse же есть.
Есть, только куда ее прилепить и в варианте calabi-yau, и в моем...
0
 Аватар для Сtrl
144 / 134 / 8
Регистрация: 19.07.2011
Сообщений: 184
06.07.2012, 09:35
Цитата Сообщение от programm1r Посмотреть сообщение
Есть, только куда ее прилепить и в варианте calabi-yau, и в моем...
Haskell
1
2
3
4
import Data.List
 
f :: Eq a => [a] -> [a] -> Maybe (a,a)
f = ((find (uncurry (/=)) . reverse) . ) . zip
Haskell
1
2
3
4
5
6
7
8
9
10
import Data.List
import Data.Maybe
 
f1 :: (Eq a) => [a] -> [a] -> Maybe (a,a)
f1 [] _ = Nothing
f1 _ [] = Nothing
f1 (x:xs) (y:ys) =
    let b = f1 xs ys in
    if isJust b then b else
    if x /= y then Just(x,y) else Nothing
1
 Аватар для programm1r
48 / 47 / 7
Регистрация: 19.06.2012
Сообщений: 134
06.07.2012, 17:00  [ТС]
calabi-yau тоже спасибо, не вижу где ему +1.
0
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
06.07.2012, 17:01
programm1r, сообщений у него мало
0
 Аватар для programm1r
48 / 47 / 7
Регистрация: 19.06.2012
Сообщений: 134
06.07.2012, 17:52  [ТС]
Понятно. А вот вы Nameless One так всегда красиво отвечаете, ну и остальных тоже прошу помочь. Пытаюсь вникнуть в таинственный haskell, получается, но до безобразия десятиэтажные решения. Довольно корявые на вид. В итоге мне нужна была функция сравнения двух списков на (<), при этом список представляет собой разряды числа, записанные по форме "младший разряд по младшему индексу", каждый элемент списка Word8. Пытался я из всех подсказок собрать такую функцию, работает, результат правильный, а сама корявая до безобразия. Может вы и форумчане покажете различные возможные варианты этой функции, но более изящной на вид? Вот что получилось у меня:
Haskell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import Data.List  ( find )
import Data.Maybe ( fromJust, isJust )
import Data.Word  ( Word8 )
 
f1 :: Eq a => [a] -> [a] -> Maybe (a,a)
f1 = ((find (uncurry (/=)) . reverse) . ) . zip
 
less :: (Eq a, Ord a) => [a] -> [a] -> Bool
less xs ys = let b = isJust (f1 xs ys) in
                 if   b
                 then uncurry (<) $ fromJust (f1 xs ys)
                 else b
 
-- младший разряд по младшему индексу!
less1 :: [Word8] -> [Word8] -> Bool
less1 []  [] = False
less1 [0] [] = False
less1 [] [0] = False
less1 xs  [] = False
less1 []  ys = True
less1 xs  ys | (length xs) < (length ys) = True
             | (length xs) > (length ys) = False
             | otherwise = less xs ys
Функция less1 xs ys и есть цель. Список - это число, поразрядно размещенное в списке, один элемент - один разряд. Вот, а я бы на вашем умении поучился. Спасибо
0
 Аватар для Сtrl
144 / 134 / 8
Регистрация: 19.07.2011
Сообщений: 184
06.07.2012, 19:53
Насколько я понял, вам нужно сравнить два числа, представленных списком разрядов от младшего к старшему. В моем решении функция cmpNum выполняет сравнение и возвращает результат типа Ordering, а функция less просто сравнивает этот результат с LT.

Haskell
1
2
3
4
5
6
7
8
cmpNum =
    let prep = dropWhile (==0) . reverse in
    (. prep) . (cmpNum' . prep)
    where cmpNum' xs ys =
        let b = compare (length xs) (length ys) in
        if b /= EQ then b else compare xs ys
        
lessNum = ((==LT) . ) . cmpNum
Не смог избавиться от аргументов в функции cmpNum' - знатоков прошу помочь.
0
 Аватар для programm1r
48 / 47 / 7
Регистрация: 19.06.2012
Сообщений: 134
06.07.2012, 20:06  [ТС]
У меня GHC ругается почему то на 5-ю строку:
Haskell
1
parse error (possibly incorrect indentation)
0
 Аватар для Сtrl
144 / 134 / 8
Регистрация: 19.07.2011
Сообщений: 184
06.07.2012, 20:17
Форум преобразовал мою табуляцию в пробелы, а я и не заметил.

Копируйте отсюда: http://pastebin.com/raw.php?i=thdufJfZ
1
 Аватар для programm1r
48 / 47 / 7
Регистрация: 19.06.2012
Сообщений: 134
06.07.2012, 20:23  [ТС]
Забавно, прям как в python.

Добавлено через 2 минуты
Уже как то компактней... может еще какие варианты кто-нибудь предложит?
0
313 / 268 / 5
Регистрация: 03.04.2011
Сообщений: 456
06.07.2012, 21:34
Цитата Сообщение от Сtrl Посмотреть сообщение
Не смог избавиться от аргументов в функции cmpNum'
Ну, если её (cmpNum') переписать немножко по-другому (с учётом того факта, что Ordering является экземпляром (instance) Monoid-a), то тогда довольно просто:
Haskell
1
2
3
4
5
6
7
8
9
10
{-# LANGUAGE NoMonomorphismRestriction #-}
 
import Data.Function (on)
import Data.Monoid (mappend)
import Control.Monad (ap)
import Control.Arrow ()
 
f1 xs ys = (compare `on` length) xs ys `mappend` compare xs ys
 
f2 = ap (ap . (mappend .) . (compare `on` length)) compare
2
 Аватар для programm1r
48 / 47 / 7
Регистрация: 19.06.2012
Сообщений: 134
06.07.2012, 22:49  [ТС]
Пошел читать что за функция "on".
0
 Аватар для calabi-yau
78 / 64 / 5
Регистрация: 25.03.2012
Сообщений: 71
07.07.2012, 00:18
Цитата Сообщение от bokunopico Посмотреть сообщение
f1 xs ys = (compare `on` length) xs ys `mappend` compare xs ys
т.к функция является моноидом, то аргументы можно просто опустить:
Haskell
1
f1 = (compare `on` length) `mappend` compare
0
313 / 268 / 5
Регистрация: 03.04.2011
Сообщений: 456
07.07.2012, 00:29
Цитата Сообщение от calabi-yau Посмотреть сообщение
т.к функция является моноидом, то аргументы можно просто опустить
Хитрый lambdabot-петух (@pl) выставил меня дураком.
0
 Аватар для programm1r
48 / 47 / 7
Регистрация: 19.06.2012
Сообщений: 134
07.07.2012, 00:55  [ТС]
Поясните пожалуйста, что то понять не могу:
Haskell
1
2
>> max 4 5 + max 6 7
12
как в данной ситуации использовать функцию "on"?
0
 Аватар для Сtrl
144 / 134 / 8
Регистрация: 19.07.2011
Сообщений: 184
07.07.2012, 01:03
Никак, потому что max принимает два аргумента. Можно сгруппировать аргументы в кортеж, и тогда получится так:
Haskell
1
on (+) (uncurry max) (4,5) (6,7)
1
 Аватар для programm1r
48 / 47 / 7
Регистрация: 19.06.2012
Сообщений: 134
07.07.2012, 09:22  [ТС]
Эти функции дают не правильный результат:
Haskell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
-- bokunopico
f1 xs ys = (compare `on` length) xs ys `mappend` compare xs ys 
f2 = ap (ap . (mappend .) . (compare `on` length)) compare
 
-- calabi-yau
f1 = (compare `on` length) `mappend` compare
 
-- а вот эта функция (Ctrl) правильный:
cmpNum =
    let prep = dropWhile (==0) . reverse in
    (. prep) . (cmpNum' . prep)
    where cmpNum' xs ys =
        let b = compare (length xs) (length ys) in
        if b /= EQ then b else compare xs ys
        
lessNum = ((==LT) . ) . cmpNum
так как:
Haskell
1
2
3
4
5
>> f1 [4,2,1] [2,2,3]
GT
it :: Ordering
(0.00 secs, 521836 bytes)
>>
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
07.07.2012, 09:22
Помогаю со студенческими работами здесь

Найти номера первых двух рядом стоящих равных чисел
День добрый, помогите пожалуйста по информатике. Задание: Дан массив целых чисел-А={ai}, где i={1,2.....n} Найти номера первых двух...

В элементы третьего массива записать сумму соответствующих элементов первых двух массивов
Добрый вечер. Даны три массива размерности 17. Первые два заполнить случайными значениями от 10 до 30. Вывести массивы на экран. В...

В элементы третьего массива записать сумму соответствующих элементов первых двух массивов
Объявить три массива. Первые два заполнить случайными значениями от 10 до 30. В элементы третьего массива записать сумму соответствующих...

В элементы третьего массива записать сумму соответствующих элементов первых двух массивов
Объявить три массива. Первые два заполнить случайными значениями от 10 до 30. В элементы третьего массива записать сумму соответствующих...

Определить, содержит ли последовательность хотя бы одну пару равных соседних элементов
дана последовательность из вещественных чисел которые вводятся по одному. за последним числом вводиться нуль. определить, содержит ли эта...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru