Haskell: Застрял в написании функции для репликации "элемента" - PullRequest
3 голосов
/ 19 февраля 2011

Для моей самой первой лекции в Haskell мы дали ряд проблем.Один из них - вернуть True, если в списке присутствует число n, или False в противном случае.Мне удалось получить то, что я считаю на полпути, но я получаю разные ошибки компиляции, и я очень расстроен, потому что я даже могу понять, что они означают.

Очевидно, что это для класса, поэтому , пожалуйста, не публикуйте ответ.Но, может быть, несколько примеров, которые помогут мне понять, как работает Haskell, и как решить проблему.Любой указатель будет оценен по достоинству.


РЕШЕНИЕ

matches :: Int -> [Int] -> [Int]
matches x y = [a | a <-y, a==x]

myelem :: Int -> [Int] -> Bool
myelem x [] = False
myelem x (y:ys)
 | x == y = True
 | otherwise = myelem x (ys)

Приветствия, ребята

Ответы [ 5 ]

2 голосов
/ 19 февраля 2011

Проблема в вашем последнем уравнении:

myelem x (y:ys)
 | x == y = y : x myelem ys

Здесь есть две проблемы:

  1. Если вы хотите использовать myelem в качестве инфиксного оператора, вы должны заключить его в обратные черты, например:

    x `myelem` ys
    
  2. Учитывая то, что вы имели в виду, правая часть вашего уравнения не проверяет тип; конструктор списка (:) требует, чтобы его второй аргумент был списком, а не Bool. Кроме того, (:) создает список, а myelem должен возвращать Bool!

Подумайте о том, что вы пытаетесь сделать. Если x == y, вы просто хотите вернуть True, верно? И otherwise, вы хотите вернуть результат проверки остальной части списка (ys). Надеюсь, это поможет.

1 голос
/ 19 февраля 2011

Вы также можете написать свою функцию, используя некоторую комбинацию из следующих функций (есть как минимум два способа сделать это, используя функции ниже):

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

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

null :: [a] -> Bool

возвращает, является ли список пустым или нет

not :: Bool -> Bool

является логическим отрицанием

or :: [Bool] -> Bool

возвращает True, если список Bool содержит одинили более Истинные значения.

Очевидно, что вы решили свою проблему, но это может помочь вам изучить другие способы сделать то же самое.

1 голос
/ 19 февраля 2011

Вы пытаетесь объединить Int и Bool в последней строке;Подумайте еще раз.

Вы никогда не вернетесь True из myelem;иногда это уместно.

Как только эти проблемы исправлены, код работает.

1 голос
/ 19 февраля 2011

Вы на самом деле очень близки к правильному ответу.Однако я вижу две основные проблемы.Во-первых, вызов myelem в последней строке кода должен иметь обратные кавычки, чтобы сделать его инфиксным (x `myelem` ys) или префиксным вызовом без обратных кавычек (myelem x ys).Кроме того, вы не хотите добавлять y к результату рекурсивного вызова.На самом деле вам не нужно условие для вашего второго шаблона: просто подумайте о том, что myelem x (y:ys) должно возвращать, используя простые логические операции и рекурсивный вызов, который у вас уже есть.

0 голосов
/ 19 февраля 2011

Обратите внимание, что вы также можете определить свою функцию myelem в терминах matches.

  • Что совпадет с возвратом, если элемент отсутствует в списке?
  • Что совпадет с возвратом, если элемент будет в списке один раз? дважды? много раз?
  • Вас интересует все возвращаемое значение во втором случае? (подсказка: нет)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...