我在使用列表时遇到了麻烦。
我有以下列表列表:
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"
答案 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)
以下是您可以做的一些事情:
处理错误。单词列表和最后一个单词本身都可以为空。
last
是partial 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 ...
注意:将do
和if-then-else
结合使用时要注意缩进级别。