LINUX.ORG.RU

Haskell Создать список из существующего

 , , ,


0

2

Привет всем,

Недавно начала изучать Haskell и остановилась на задаче:

Каким способом можно создать новый список из существующего. Вот например у меня есть list АВ = [(0,a0,b0),(1,a1,b1),..,(n-1,a(n-1),b(n-1)] и из этого списка взять только а0,а1..аn и создать новый список List A = [а0,а1..а(n-1)]?

Если кто-то направит в нужную сторону решения, буду очень благодарна. Возможно еще кто-то знает хорошие книги по изучению Haskell с примерами.

Спасибо))



Последнее исправление: simona (всего исправлений: 1)

странно чуток что в листе AB указаны a(n-1), а требуются a0..an.
Но вероятно тебе нужен map (или, другое название, fmap).

AndreyKl ★★★★★
()

Откуда задачи берёшь?

Artamudo ★★★★
()

Graham Hutton - Programming in Haskell - 2016 второе издание. Для не осиливших english на Stepik.org есть 2 курса по Haskell - лучшее в RU сегменте.

По задаче - её можно сделать многими разными способами (зависит от знаний).

Vault_Boy
()
Ответ на: комментарий от Vault_Boy

Может оно и так. Но как по мне так вполне читаемо. А темп там достаточно спокойный.

А что именно не удалось автору на ваш взгляд?

AndreyKl ★★★★★
()
Ответ на: комментарий от Vault_Boy

Не знал, да и я привык сразу на английском читать, потому что на русском, как правило, ничего не понимаю.

Что скажешь про этот учебник (конечно, он не для новичков)?

rassol
()
Ответ на: комментарий от rassol

неплохой,но… Graham учёл во втором издании свои ошибки, у него тяжелые темы описаны легче. Плюс у него качественные видео на youtube (монады, лямбды). Что ещё быо сделано во втором издании - примеры и задания. Если не увиливать и делать…

Vault_Boy
()
Ответ на: комментарий от AndreyKl

Отстутствие матана. Я видел презентации Дениса, его подход к задачам. Это моё личное мнение. Денис, как слесарь. А phd, как дирижер. Главное, подход другой.

Поэтому не рекомендую чтобы не приучаться к дурному вкусу, особенно в начале обучения.

Vault_Boy
()
Ответ на: комментарий от Vault_Boy

Спасибо за ответ. Считаю матан важным. Однако с чего то надо начинать. По-моему у Дениса весьма простое введение, именно этим книга на мой взгляд ценна. Поэтому продолжу рекомендовать.

AndreyKl ★★★★★
()
Ответ на: комментарий от AndreyKl

Да язык простой, а вот абстракции (за что и ценен) у Дениса предоставлены неудачно. У того же Дениса Москвина объяснения на порядок лучше. Просто раньше этих видео не было, теперь - есть.

https://www.youtube.com/watch?v=iMbzW97Jg7c&list=PLoWGNURguz9W5K9_XcmpLcLVTLnv-QG-h

Vault_Boy
()
Ответ на: комментарий от rassol

А как эту строку правильно написать в коде в отдельном документе, что бы в дальнейшем я могла вызвать этот список и делать действия над его элементами? Спасибо 🙂

simona
() автор топика

Недавно начала изучать Haskell и остановилась на задаче:

Будь сообщение от лица парня, тут бы уже объясняли либо какое говно этот ваш Haskell, либо почему тебе не стоит быть программистом. Где-то у меня даже картинка валялась...

cherry_boy
()
Последнее исправление: cherry_boy (всего исправлений: 1)
Ответ на: комментарий от simona

Если тебе нужна константа, содержащая этот список, то так:

ab = [(1,2,3),(4,5,6),(7,8,9)]
...
a = [x | (_,x,_) <- ab]

Если тебе нужна функция, принимающая список ab и возвращающая новый список, то можно так:

listOfSecond :: [(a,b,c)] -> [b]
listOfSecond x = [sx | (_,sx,_) <- x]
...
ab = [(1,2,3),(4,5,6),(7,8,9)]
...
a = listOfSecond ab
rassol
()

Лучше не приучаться к list comprehension-однострочникам, они considered harmful. Уже лучше do-нотация:

lst = [(1,2,3),(4,5,6),(7,8,9)]
s = do
 \(_, x, _) <- lst
 return x

А ещё лучше:

s = (\(a, b, c) -> b) <$> lst
-- что то же самое, что
s = map (\(a, b, c) -> b) lst
-- Можно и так:
s = lst >>= \(a, b, c) -> [b]
-- или даже так:
import Data.Functor (<&>) -- можно и самому сказать (<&>) = flip (<$>)
s = lst <&> \(a, b, c) -> b

Имхо, два последних варианта самые хорошие. Особенно последний.

Почему я избегаю list comprehensions? Пока это простая выборка - всё ок. Но как только нужно сделать несколько операций, приходится переписывать. А делать цепочку из операций приходится часто. Варианты с do и <&> легко расширять.

anonymous
()
Ответ на: комментарий от anonymous

лол, дитятко, неужто ты залез ко мне в профиль и проштудировал мои комменты? ох, уел, ох, уел, ничего не скажешь :)

Virtuos86 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.