1

// i がこれらの 2 行のみを使用する場合は 5 を編集

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

それは正常に動作します!!!!

例えば:

インデックス ["asd","asdd","露"] ["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

レイアウトルールとifをネストする方法を学習しようとしている可能性があるため、これは少しトピックから外れていますが、リビジョン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 ()(アフターputStrLnはすでに戻ってくるので必要ありません()。)

パターンマッチングは、多くのインデントなどを必要としないため、正しく行うのがはるかに簡単です。


編集:

私はあなたの定義index'から少し変更しました。私のバージョンでは、ローカル関数ではなくローカル変数です。Haskellでは、大きな違いはありません。それは、周囲の関数を使用するだけなのでindex'、パラメーターを取得する必要はありません。(確かに、変数の名前としてはあまり適切ではありません。)abindexindex'

また、私は通常それらを書かないので、型注釈を省略しました。しかし、何かが機能していないときに役立ちます。これがどのように見えるかです:

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

Haskellのif構文は式です。つまり、常に値に評価される必要があるため、このelse部分は必須です。

また、 の最初の部分はifブール値でなければならないため、ではなくindex'を返すため、そこを呼び出すことはできません。[Int]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
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 に答える
0

Haskell での IO 操作は、いわゆるモナド が必要なため、少し難しくなります。出力を順序付けるには、ここで特別な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 に答える