2012-01-09 6 views
1

я пытаюсь выбрать несколько списков из списка, если условие истинно, что-то вроде этого:Haskell: выбор списков из списка, когда условие истинно

Я сделал структуру данных ->data File = File {name :: String, size :: Integer, comment :: String} deriving Show

И я уже сделал библиотеку со всеми файлами следующих этой структуры:

файлов = [[ "NAME1", size1, "coment1"], [ "name2", size2, "coment2" ], ["name3", size3, "coment3"], ...]

Теперь то, что мне нужно, это функция, которая выбирает мне все списки размеры которых, например,> = 500, что-то вроде

list = select ((>=500.size) files)

Так что, если я имел:

files = [["asd",345,"coment1"],["fgh",678,"coment2"],["hjk",123,"coment3"],...]

Я хотел бы получить:

list = [["fgh",678,"coment2"]]

Любая помощь была бы с удовольствием оценена.

Заранее спасибо.

ответ

5

Прелюдия содержит полезную

filter :: (a -> Bool) -> [a] -> [a] 

, который делает то, что вы собираетесь ваш select сделать.

Ответ на ваш комментарий к ответу Джона Пардью в:

filter ((>= 500) . size) files 

Помимо:

files = [["asd",345,"coment1"],["fgh",678,"coment2"],["hjk",123,"coment3"],...] 

не будет работать, списки однородны. Она должна в контексте вопроса будет

files = [File "asd" 345 "coment1", File "fgh" 678 "coment2", ... ] 

File того, были определены с записью-синтаксиса, вы можете использовать его с использованием синтаксиса записи или ванильным позиционного синтаксиса, независимо лучше в данной ситуации. Синтаксис записи будет более типичным, чем указано выше, но если вы его использовали, files = [File{ name = "asd", size = 345, comment = "coment1" }, ... ] будет продолжать работать, если вы добавили поля к типу. Затем добавленные поля будут создаваться с помощью undefined, что может быть или не быть лучше кода, а не компиляция без изменений.

+0

Спасибо Даниэлю, моя ошибка заключалась в том, что я звонил _size_, когда фактическое имя в структуре данных было _filesize_, и я думал, что делаю какую-то ошибку. Спасибо друг – seph

3

Вы хотите filter :: (a -> Bool) -> [a] -> [a], который находится в Прелюдии.

A quick Hoogle query поможет вам найти подобные вещи в будущем.

+0

Я действительно хочу работать с фильтром , я сомневаюсь, как мне командовать фильтром только размера? – seph

+0

@seph: 'filter ((> = 500). Size) list' должно быть хорошо. Частичное применение инфиксного оператора ('> =') называется * секцией * и должно быть в круглых скобках. Вы можете составить это с помощью 'size' обычным способом. –

+0

да, я тоже сделал эту ошибку, забыл круглые скобки, теперь все ясно, спасибо. – seph

1

С входного файла, как

data File = File {name :: String, size :: Integer, comment :: String} 
      deriving Show 

files = [File "asd" 345 "coment1", 
     File "fgh" 678 "coment2", 
     File "hjk" 123 "coment3"] 

, то вы можете использовать

filter :: (a -> Bool) -> [a] -> [a] 

как это, чтобы получить то, что вы хотите:

filter ((>= 500) . size) files 
Смежные вопросы