1

//当我只使用这 2 行时编辑 5

  index :: [String] -> [String] -> Bool
  index a b = and [x `elem` a |x <- b]

它工作正常!!!!

例如:

索引 ["asd","asdd","dew"] ["asdd","asdad"]

错误的

但是当我使用下面提到的整个代码时

empty [] = True
empty _ = False

    index a b = do
             if empty a
              then do putStrLn "a is empty"
                      else return ()
             if empty b
              then do putStrLn "b is empty"
                      else return ()
        where
          index :: [String] -> [String] -> Bool
          index a b = and [x `elem` a |x <- b]

没有输出!!这就是我遇到的问题!

//编辑 6

index a b = do index'
         if empty a
          then do putStrLn "a is empty"
                  else return ()
         if empty b
          then do putStrLn "b is empty"
                  else return ()
    where
      index' :: [String] -> [String] -> Bool
      index' a b = and [x `elem` a |x <- b]

谢谢

4

4 回答 4

4

这有点离题,因为您可能正在尝试学习布局规则以及如何嵌套 ifs,但是您在修订版 6 中显示的代码仅if用于进行错误检查。我只是通过模式匹配而不是if.

index [] _ = putStrLn "a is empty"
index _ [] = putStrLn "b is empty"
index a b = putStrLn (show index')
    where index' = and [x `elem` a | x <- b]

(你不需要return ()afterputStrLn因为它已经()为你返回了。)

模式匹配更容易正确,因为它不需要很多缩进等。


编辑:

index'从你的角度改变了一点的定义。在我的版本中,它是局部变量而不是局部函数。在 Haskell 中,并没有太大的区别,只是index'使用了aand bfrom 周围的index函数,所以不需要带参数。(诚​​然,index'对于变量来说,这不是一个好名字。)

我也省略了类型注释,因为我通常不写它们。但是当某些东西不起作用时,它们会很有帮助。这是它的样子:

    where index' :: Bool
          index' = and [x `elem` a | x <- b]
于 2009-05-17T13:47:17.157 回答
2

Haskell 中的if构造是一个表达式。这意味着它必须始终评估为一个值,因此该else部分是强制性的。

此外,的第一部分if必须是布尔值,所以你不能index'在那里调用,因为它返回 a [Int],而不是 a Bool

我会说,从这样的事情开始:

if isEmpty a
then putStrLn "a is empty"
else if isEmpty b
     then putStrLn "b is empty"
     else putStrLn "neither are empty"
于 2009-05-17T08:56:56.263 回答
0

Haskell 中的 IO 操作有点困难,因为它们需要所谓的monads 你需要一个特殊的do-notion 来对输出进行排序。

像这样写:

empty [] = True
empty _ = False

index a b = do
         if empty a
          then do putStrLn "a is empty"
          else return ()
         if empty b
          then do putStrLn "b is empty"
          else return ()

或者也许你可以只返回字符串并putStrLn单独使用。index'当它应该用作 if 条件时,您必须返回一个布尔值!

于 2009-05-17T08:50:56.963 回答
0
index a b = if index' [] bs
                       then putStrLn "a is empty"
                       if index' a []          
                        then putStrLn "b is empty"
                        else                  
    where 
        index' :: [String] -> [String] -> [Int]
        index' a b = index' True [(elem x b) | x <- a]

如果你像这样缩进你的语句,你会看到第一个 if 没有匹配的 else 子句。

此外,else 子句不返回任何内容——函数在任何情况下都应该有返回值。

于 2009-05-17T08:55:18.187 回答