2

したがって、Haskell の「if」ステートメントにアプローチするさまざまな方法を検索しましたが、ガードについて疑問があります。たとえば、タプルがあり、条件を確認して +,-,*,/ を実行したいとします。

指定された (x,y) if x < y only +,* 整数のみが必要なため、さらに除算をチェックして x mody == 0 かどうかを確認します。これはコンパイルされますが、実行できません

operaciones (x,y) = (x,y)
x,y | x < y = [(x, y, '+', x+y), (x, y, '*', x*y)]
    | (x > y) && (x `mod ` y == 0) = [(x, y, '+', x+y), (x, y, '*', x*y), (x, y, '-', x-y) , (x, y, '/', x/y)]
    | (x > y) && (x `mod ` y /= 0) = [(x, y, '+', x+y), (x, y, '*', x*y), (x, y, '-', x-y)]
    | otherwise  = [(x, y, '+', x+y), (x, y, '*', x*y), (x, y, '-', x-y) , (x, y, '/', x/y)]

私はからアイデアを取りました

Haskell: 単一関数内の複数の Case ステートメント

失敗しました。それ以外の場合は x == y の場合です

4

2 に答える 2

7

あなたが書いたものは合法的な構文ではありません。

おそらくこれが必要です:

operaciones (x,y)
    | x < y = [(x, y, '+', x+y), (x, y, '*', x*y)]
    | (x > y) && (x `mod ` y == 0) = [(x, y, '+', x+y), (x, y, '*', x*y), (x, y, '-', x-y) , (x, y, '/', x/y)]
    | (x > y) && (x `mod ` y /= 0) = [(x, y, '+', x+y), (x, y, '*', x*y), (x, y, '-', x-y)]
    | otherwise  = [(x, y, '+', x+y), (x, y, '*', x*y), (x, y, '-', x-y) , (x, y, '/', x/y)]
于 2013-04-05T17:54:52.817 に答える
3

このスタイルはお勧めしません。あなたは自分自身をあまりにも繰り返しています。私が理解しているように、この機能が必要です:

operaciones (x, y) = [
    (x, y, '+', x + y),
    (x, y, '*', x * y),
    (x, y, '-', x - y),
    (x, y, '/', x / y) ]

ただし、結果リストはフィルタリングされ、正の整数の結果のみが含まれます。(ちなみに、少なくとも英語では、「整数」には負の数と 0 が含まれるという慣習があるため、差を含める条件は「整数の結果」よりも厳密です)。

リスト内包表記を連結してフィルタリングを行います。

operaciones (x, y) =
    [ (x, y, '+', x + y) ] ++
    [ (x, y, '*', x + y) ] ++
    [ (x, y, '-', x + y) | x > y ] ++
    [ (x, y, '/', x `div` y) | x >= y, x `mod` y == 0 ] -- I'm assuming x and y have type Int or Integer, so you should use div not /

もう 1 つ注意: Haskell では、(x, y) のように複数の引数をタプルに結合することは一般的ではありません。したがって、xyが別々の引数の場合、関数の頭は次のように書く必要があります

operaciones x y =

代わりは。(コンパイラが書かれている方法では、オプティマイザは実際にはタプルを(x, y)別の形式に結合するために余分な作業を行う必要があるため、作業を節約する方がよいでしょう。)

更新:エラー報告を行うためのクリーンな方法とは思えません。おそらく、エラーチェックにガードを使用し、成功した場合に連結を使用して、ハイブリッドスタイルになるでしょう。

operaciones x y
    | x <= 0 || y <= 0 = Left "Use positive numbers"
    | otherwise = Right $
        [ (x, y, '+', x + y) ] ++ -- etc. as above

本当に必要な場合は、のerror代わりに使用Leftして省略できます。Right

于 2013-04-07T02:21:51.100 に答える