2009-05-16 10 views
0

Im new to Haskell !! 私はこのコードを書いた:式の式 - 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

あなたが書いた「このコード」はどこですか? – ShreevatsaR

+0

私たちが正しく読むためには、そのコードを少し上手くフォーマットする必要があります。 –

答えて

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機能にのみ表示されます。あなたは。私も完全に別の名前を選択している可能性がありますが、私はuncreativeだ場合。)

をあなたはまた、凝縮でき、ヘルパー機能、これを呼び出すことができますこれは以下の通りです(より一般的です):

allPresent :: (Eq t) => [t] -> [t] -> IO() 
allPresent xs ys = putStrLn (if and [y `elem` xs | y <- ys] then "ok" else "not ok") 
+0

ありがとう!意図どおりに機能しました。 inputIndexの前にカンマの意味を教えてください。 – pier

+0

1行目がなくても機能しました inputIndex :: [文字列] - > [文字列] - > IO() – pier

+0

@dlna:カンマはアポストロフィです。私はいくつかの説明で私の答えを更新しました。最初の行は本当に不必要です。それがなければ、関数は同じタイプのリストのすべてのペアに対して機能します(Haskellが可能な最も一般的な型を推論するので) – Stephan202

0
  1. それは、 "真" ではない "真" です。
  2. 2番目のinputIndex実装は、最初の実装と互換性がありません。ファンクションのすべてのパターンケースには同じ署名([String] - > [String] - > Bool)が必要です。
  3. ここに「}」がないため、ここに表示されているエラーは生成されません。
  4. putstrLnにはString -> IO()の署名がありますが、inputIndexは純粋であるように見えます。ちょうどその値を返して、別の場所に印刷してください。
関連する問題