0

我是 Haskell 的新手!!我写了这段代码:

import Data.List
inputIndex :: [String] -> [String] -> Bool
inputIndex listx input = and [x `elem` listx |x <- input]
inputIndex = if inputIndex == true
                then putStrLn ("ok")

没有if语句它可以正常工作,但是当我输入if语句时,会显示以下错误:

表达式中的语法错误(意外的“}”,可能是由于布局错误)

我在这里做错了什么?

谢谢

4

2 回答 2

8

这里有几件事是错误的:

  • 您将需要一个 else 子句。
  • True必须大写。
  • inputIndex必须始终采用两个参数(现在它没有,在最后一种情况下)。

我猜你想要这样的东西......

inputIndex :: [String] -> [String] -> IO ()
inputIndex listx input = if inputIndex' listx input
                             then putStrLn ("ok")
                             else putStrLn ("not ok")
  where
    inputIndex' :: [String] -> [String] -> Bool
    inputIndex' listx input = and [x `elem` listx |x <- input]

(在这里,我通过附加一个撇号/撇号定义了一个名称几乎相同的新函数。通过在where子句中定义它,它只对外部inputIndex函数可见。如果你愿意,你可以将其称为辅助函数。我也可以选择一个完全不同的名字,但我没有创意。)

您还可以将其浓缩为以下内容(这也更笼统):

allPresent :: (Eq t) => [t] -> [t] -> IO ()
allPresent xs ys = putStrLn (if and [y `elem` xs | y <- ys] then "ok" else "not ok")
于 2009-05-16T15:45:46.003 回答
0
  1. 是“真”,不是“真”。
  2. 您的第二个 inputIndex 实现与第一个不兼容。函数的所有模式案例必须具有相同的签名([String] -> [String] -> Bool)
  3. 您在此处显示的错误不是由此代码生成的,因为此处没有“}”。
  4. putStrLn has signature String -> IO() while your inputIndex looks like it's supposed to be pure - just return the value and print it somewhere else.
于 2009-05-16T15:50:29.503 回答