Понимание списка: если, то и возвращение 1 значения с помощью Haskell - PullRequest
0 голосов
/ 13 февраля 2012
findMatch :: [String] -> [String]
findMatch xs =
    let keywords = [("data", "set")]
    in [ if null x then "null" else fst y | x <- xs, y <- keywords, (snd y) == x]

Все в этой функции работает, кроме , а затем .Если (snd y) не может быть сопоставлено с x (x взят из списка слов, отправленных пользователем), я хотел бы вернуть строку, которая говорит "null".

in [ if (snd y) == x then fst y else "null" | x <- xs, y <- keywords]

Написание понимания списка таким образом (спасибо byorgey) работает лучше, но тогда «ноль» возвращается больше раз, чем мне нужно, когда более 1 набора слов используется в моей переменной ключевых слов.Мне нужна только строка «null» для возврата один раз.

Может быть, у Haskell есть своего рода разрыв, который я мог бы добавить?

Любая помощь будет признательна.

Ответы [ 3 ]

2 голосов
/ 13 февраля 2012

null x вернет false только если список пуст. Здесь вы применяете нуль к [Char] a.k.a. String. Но вы предикат в понимании списка препятствует тому, чтобы x когда-либо был чем-то иным, чем равным 2-му элементу кортежа в keywords.

В понимании списка элемент включается только тогда, когда он соответствует всем предикатам.

2 голосов
/ 13 февраля 2012

Я думаю, что проблема заключается в вашем понимании понимания списка. Попробуйте следующее:

[(x, y) | x <- [1,2,3], y <- [1,2]]

Это декартово произведение, возвращающее [(1,1), (1,2), (2,1), (2,2), (3,1), (3,2)].

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

1 голос
/ 13 февраля 2012

Я думаю, что вы хотите

let keywords = [("data","set")]
in [maybe "null" fst $ find ((== x) . snd) keywords | x <- xs]

, если список keywords не может содержать несколько пар с одним и тем же вторым компонентом, и вы хотите, чтобы они все были в списке, тогда это будет

in concat [case [key | (key,word) <- keywords, word == x] of { [] -> ["null"]; ms -> ms; } | x <- xs]

В первом случае было бы лучше, если бы пары keywords поменялись местами,

let keywords = [("set", "data")]
in [fromMaybe "null" $ lookup x keywords | x <- xs]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...