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常に 2 つの引数を取る必要があります (現在、最後のケースではありません)。

このようなものが欲しいと思います...

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. 2 番目の inputIndex 実装は、最初の実装と互換性がありません。関数のすべてのパターン ケースは同じシグネチャを持つ必要があります ([文字列] -> [文字列] -> ブール)
  3. ここに示すエラーは、このコードによって生成されたものではありません。ここには '}' がないからです。
  4. putStrLn には署名String -> IO()がありますinputIndexが、純粋であると思われます-値を返して別の場所に出力するだけです。
于 2009-05-16T15:50:29.503 に答える