2015-03-17 3 views
0

Я пытаюсь удалить определенного актера из списка актеров, так как есть дубликаты. У меня есть эти функции, которые делают то, что я хочу, но мне нужно, чтобы они связывались. Две функции, которые мне нужно связать, - это createWholeActorList и removeAllActor.Как связать эти две функции Haskell вместе?

type Actor = String 
type Actors = [Actor] 

showActors :: Film -> Actors --Outputs a list of the Actors in the film 
showActors (_,a,_,_) = a 

actorsInFilm :: Actor -> [Actors] 
actorsInFilm actor = map showActors (filmsActorIsIn actor) 

createWholeActorList :: Actor -> Actors 
createWholeActorList actor = concat (actorsInFilm actor) 

removeAllActor :: Actor -> Actors -> Actors 
removeAllActor _ [] = [] 
removeAllActor actor (head:tail) 
    | head == actor = removeAllActor actor tail 
    | head /= actor = head : removeAllActor actor tail 

Если этот способ сложный, существует ли способ использования понимания списка для достижения желаемого результата?

+0

Списки являются заведомо плохой структурой данных для беспокоясь о дубликатах, но это может помочь вам выглядеть в источнике ['Data.List.nub'] (http://hackage.haskell.org/package/base-4.7.0.1/docs/src/Data-List.html#nub), поскольку он выполняет эту операцию (хотя и относительно медленно). – bheklilr

ответ

1

Если желаемый эффект заключается в удалении дубликатов из списка, для использованияможет быть проще (и получить более быстрый код). Набор представляет собой структуру данных, которая может содержать каждый элемент только один раз. Таким образом, чтобы удалить дубликаты в списке, вы можете просто преобразовать его в набор и вернуться к списку.

import Data.Set (Set) 
import qualified Data.Set as Set 
removeDuplicates :: Ord a => [a] -> [a] 
removeDuplicates = Set.toList . Set.fromList 

Затем createActorList можно определить как

createActorList :: Actor -> [Actor] 
createActorList = removeDuplicates . createWholeActorList 

Или без createWholeActorList

createActorList = removeDuplicates . concat . actorsInFilm 
Смежные вопросы