如何检查列表的最后一个元素是否是另一个列表的成员?

时间:2019-03-27 07:50:49

标签: haskell

我在使用列表时遇到了麻烦。

我有以下列表列表:

sentence = [['t','h','e'], ['b','o','y'],['i','s'],['h','a','p','p','y']]

shortVowel = [['a'], ['e'], ['y']]

我需要创建一个if语句来检查2件事情:

(1)如果元素x是最后一个“子列表”的成员(当然,它是主列表的最后一个元素),

和(2)如果列表shortVowel的元素(子列表)是最后一个子列表的最后一个成员。

我能够用elem 'а' (last sentence))做的(1)(检查'a'是否是['h','a','p','p','y']的成员,

(2)是我不知道如何获得的那个。

例如,sentence中最后一个子列表的最后一个元素是y(来自happY)。并且y也是shortVowel列表中的子列表。

我需要检查一下。

我尝试了一些操作,例如elem shortVowel (last sentence),但是没有用。

这是我当前的代码:

import Data.List

sentence = [['t','h','e'], ['b','o','y'],['i','s'],['h','a','p','p','y']]

shortVowel = [['a'], ['e'], ['y']]

main =  if ((elem 'а' (last sentence)) || (elem 'о' (last sentence)) || (elem 'у' (last sentence)) && (elem shortVowel (last sentence)))
           then putStrLn "A"
        else if (elem 'р' (last sentence))
           then putStrLn "B"
        else putStrLn "C"

2 个答案:

答案 0 :(得分:2)

我会写shortVowel = [['a'], ['e'], ['y']]而不是写shortVowel' = ['a', 'e', 'y']。与shortVowel' = "aey"相同。现在做

or [x == last $ last sentence | x <- shortVowel']

以上内容检查shortVowel中的任何元素是否是句子中最后一个单词的最后一个元素。如果要检查所有短元音,请

[(x, x == last $ last sentence) | x <- shortVowel']

答案 1 :(得分:2)

以下是您可以做的一些事情:

  • 处理错误。单词列表和最后一个单词本身都可以为空。

    lastpartial function,并且可能在运行时崩溃。

  • 将您的逻辑移至与main :: IO分开的纯函数中。

    使示例字符串成为函数的参数。

    然后处理分别从句子中提取最后一个单词的问题。

这是一个例子:

module Main where

-- | `lastMay [x,y,z] == Just z` and `lastMay [] == Nothing`.
lastMay :: [a] -> Maybe a
lastMay [] = Nothing
lastMay [x] = Just x
lastMay (_:xs) = lastMay xs

-- | `endsWithShortVowel "yay" == True` and `endsWithShortVowel "moo" == False`.
wordEndsWithShortVowel :: String -> Bool
wordEndsWithShortVowel s = case lastMay s of
  Nothing -> False -- No letters in word!
  Just c -> c `elem` "aey"

sentenceEndsWithShortVowel :: [String] -> Bool
sentenceEndsWithShortVowel s = case lastMay s of
  Nothing -> False -- No words in sentence!
  Just w -> wordEndsWithShortVowel w

main :: IO ()
main =
  if sentenceEndsWithShortVowel exampleSentence
    then ...
    else ...

exampleSentence :: [String]
exampleSentence = words "the boy is happy"

然后,例如,使程序易于接受来自标准输入的字符串:

main :: IO ()
main = do
  sentence <- words <$> getLine
  if sentenceEndsWithShortVowel sentence
    then ...
    else ...

注意:将doif-then-else结合使用时要注意缩进级别。