2012-01-03 2 views
0

Это небольшая часть моей домашней работы, мне нужно подсчитать элементы списка, а если count == 2, верните true. элементы этого списка не являются фиксированными, но фильтруются с использованием различных функций, например, allNumbers. Я должен использовать эту существующую функцию, чтобы проверить, есть ли у нее 2 элемента или нет.Подсчет элементов в списке (haskell)

определение функции проверки будет:

isTrue :: Int -> Bool 

У меня есть функция тока определяется

divisors :: Int -> [Int] 
divisors n | n < 1 = [] 
      | otherwise = filter (\k -> n `mod` k == 0) [1..n] 

Что это делает перечисляет все числа, которые делят п. теперь мне нужно сделать еще одну функцию isTrue в той же программе, которая даст true, если список, созданный указанной выше функцией, имеет только два числа.

+0

Список, созданный 'divisors', может содержать только числа, потому что он называется списком' Int'. Вы имели в виду, что «[...] имеет только * 2 * цифры»? – phimuemue

+0

Спасибо за ваш ответ. да список - это список Int, я имел в виду, что isTrue - это другая функция, которая возвращает true, если список, созданный делителями, содержит только 2 элемента. поэтому я предполагаю, что он будет в состоянии, когда n> 1, но теперь точно, как его реализовать здесь. – Amjad

ответ

7

Насколько я понимаю, вам нужна функция, берущая список и возвращающая логическое значение. Таким образом, подпись должна быть что-то вроде:

doit :: [a] -> Bool 

doit (x:y:z) = True -- matches if the list contains at least 2 elements 
doit _ = False  -- matches otherwise (i.e. list has 0 or 1 element) 

-- or, we match only if the length is exactly 2 

newdoit :: [a] -> Bool 
newdoit [a,b] = True 
newdoit _ = False 

-- or even more elegant 
simpledoit l = (length l)==2 

-- the complete function is then e.g. 
completefunc l = newdoit (divisors l) 
+0

Я ошибся в своем вопросе. функция isTrue должна возвращать true, если подсчет списка = 2. ничего, кроме этого, является ложным. – Amjad

+0

спасибо. но как использовать результат (список) другой функции вместо [Int] или [a]? – Amjad

+1

'simpledoit (otherfunction mylist)', btw: вы знаете это? http://learnyouahaskell.com/chapters – phimuemue

0
length' xs = case ((length xs) > 2) of 
        True -> True 
        _ -> False 
+0

Ух, давай, тогда хотя бы 'длина 'хс = (длина хс)> 2' пожалуйста. – ShiDoiSi

4

Я не хочу, чтобы отдать все решения, но я думаю, что стоит отметить, что помимо собирается какое-то решение, которое использует функцию length для вычислить длину списка и затем дать соответствующий результат, вы также можете рассмотреть здесь pattern matching, потому что длина, которую вы сравниваете с (2), довольно мала. Так что-то вроде

hasLengthOfTwo <pattern_matching_lists_with_two_elements> = True 
hasLengthOfTwo _ = False 

Небольшое (возможно, не имеющее значения) преимущество в том, что оно также работает с бесконечными списками.

Смежные вопросы