1

私は Haskell でパターン マッチングを学んでいますが、パターン マッチングに良いとされるいくつかの演習を見つけました。

式で加算演算の数を返す関数の書き方について少し情報を提供できる人はいますか?

少し調べてみましたが、これといった情報はありませんでした。実際、Haskellで操作の数を返すにはどうすればよいですか?

私が理解していない別の演習は、式で定数の数を返す関数を書くことです。定数の数の意味がわかりませんでした。多分式で変数を使用しましたか?

編集:

式の定義を追加するのを忘れていました。これに関連して私が見つけたのは次のとおりです。

例 (式ツリー)

data Expression = Constant Integer
        | Negate Expression
        | Add Expression Expression
        | Multiply Expression Expression
   deriving Show

例 (式の評価)

eval e = case e of
    Constant c -> c
    Negate e    -> -(eval e)
    Add e1 e2     -> (eval e1) + (eval e2)
    Multiply e1 e2 -> (eval e1) * (eval e2)

ありがとうございました。

4

1 に答える 1

2

足し算の数え方

追加がある場合を見てみましょう。

data Expression = Constant Integer
                | Negate Expression
                | Add Expression Expression  -- here!
                | Multiply Expression Expression

OK、そのためのパターンマッチング関数を作りましょう

countAdds :: Expression -> Int

定数になし:

countAdds (Constant i) = 0

何かを否定した場合、その中に追加があった可能性があります - それらを数えて、それを答えとして返しましょう:

countAdds (Negate expr) = countAdds expr -- cool recursion trick

ここにがある場合Add、それは 1 つですが、追加している 2 つの式にはさらに追加がある可能性があります。

countAdds (Add expr1 expr2) = 1 + countAdds expr1 + countAdds expr2

しかし、 aMultiplyでは、乗算している2つの式に多くあります:

countAdds (Multiply expr1 expr2) = countAdds expr1 + countAdds expr2

すべてをまとめると、次のようになります。

countAdds :: Expression -> Int
countAdds (Constant i) = 0
countAdds (Negate expr) = countAdds expr -- cool recursion trick
countAdds (Add expr1 expr2) = 1 + countAdds expr1 + countAdds expr2
countAdds (Multiply expr1 expr2) = countAdds expr1 + countAdds expr2

他のものを数える

足し算を数える方法と同様の方法で、他の問題を解決できます。

操作の総数については1 +Multiplyパターンと、場合によってはパターンも必要Negateです。(足し算や掛け算のような二項演算を数えたかったのか、否定のような単項演算を数えたかっただけなのかはわかりません。)

1定数のカウントは、使用した場所を使用することを除いて、非常によく似た方法で機能します0。必要ですか1 +

行ってみて、あなたがどのようにうまくいくか見てください。

于 2013-05-30T18:04:07.720 に答える