EDIT FOR CLARITY: Я знаю, что такое ошибка «голова пустого списка» и почему она выбрасывается. Я не знаю, почему нет ошибки, когда я использую «elem», но есть, если я использую «mElem». Это единственное изменение, которое я делаю, чтобы вызвать ошибку.Как это небольшое изменение разбивает мою программу?
Если я использую функцию Prelude.elem, программа запускается с одной небольшой ошибкой. Я написал свою версию «elem» (mElem), чтобы встретить эту ошибку. Я посмотрел исходный код для «elem» и написал мою функцию в подобном стиле. Тем не менее, программа выходит из строя из-за «голову пустой список ошибок» в результате функции «» getExisting
genTupleCount :: [F.Record] -> [(String, Int)] -> [(String, Int)]
genTupleCount [] tuples = tuples
genTupleCount (x:xs) tuples | mElem (F.club x) (map fst tuples) = genTupleCount xs $ getNewTuples tuples existing
| otherwise = genTupleCount xs $ (F.club x, 1):tuples
where
existing = getExisting x tuples
getExisting :: F.Record -> [(String, Int)] -> (String, Int)
getExisting x tuples = head $ filter ((==F.club x).fst) tuples
getNewTuples :: [(String, Int)] -> (String, Int) -> [(String, Int)]
getNewTuples old e = (fst e, 1 + (snd e)):(delete e old)
mElem :: String -> [String] -> Bool
mElem _ [] = False
mElem str (x:xs) = (map toLower str) == (map toLower x) || mElem str xs
Если я использую elem, ошибки не возникает, но если я изменю его на mElem, то ошибка, которую объяснил Мэтт. – Shane
elem никогда не возвращался True, но mElem сделал, по-видимому, так что getExisting в конечном итоге получил оценку. – Ingo