表达式中的语法 - Haskell

时间:2009-05-16 15:25:29

标签: haskell if-statement

我是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语句时,会显示以下错误:

  

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

我在这里做错了什么?

由于

2 个答案:

答案 0 :(得分: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")

答案 1 :(得分:0)

  1. 这是“真实”,而不是“真实”。
  2. 您的第二个inputIndex实现与第一个不兼容。函数的所有模式案例都必须具有相同的签名([String] - &gt; [String] - &gt; Bool)
  3. 此处显示的错误不是由此代码生成的,因为此处没有“}”。
  4. putStrLn有签名String -> IO(),而你的inputIndex看起来应该是纯粹的 - 只需返回值并将其打印到其他地方。