0

関数があるとしましょう:

isOne :: Int -> Int -> Int
isOne x y =

次に、if x == 1and y != 1then が返され1(パラメーターの 1 つが 1 に等しい)、if x == 1and y == 1it が返さ2れ (両方が 1 であるため)、if x != 1and y != 1it が返されます0

if ステートメント (またはケースを使用) で複数のチェックを行う方法がわかりません。

4

4 に答える 4

6

英語を Haskell に翻訳するだけです。

if (x==1) && (y /= 1) then 1
else if (x/=1) && (y==1) then 1
...

しかし、あなたは本当に欲しい:

isOne 1 1 = 2
isOne 1 _ = 1
isOne _ 1 = 1
isOne _ _ = 0

または、さらに短く:

isOne x y = fromEnum (x==1) + fromEnum (y==1)
于 2013-02-26T23:35:46.423 に答える
5

これを行う最も簡単な方法は、パターン マッチを使用することです。ケースごとに関数を定義できます。これは、発生した順序で解釈されます。

isOne 1 1 = 2
isOne 1 _ = 1
isOne _ 1 = 1
isOne _ _ = 0

または、ガードを使用できます

isOne x y | (x == 1) && (y == 1) = 2
          | (x == 1) && (y != 1) = 1
          | (x != 1) && (y == 1) = 1
          | otherwise            = 0

繰り返しますが、これらは上から下にチェックされます。つまり、最初のガードが一致する場合は最初の式を使用し、一致しない場合は 2 番目の式を試行します。これも書けます

isOne x y | (x == 1) && (y == 1) = 2
isOne x y | (x == 1) && (y != 1) = 1
isOne x y | (x != 1) && (y == 1) = 1
isOne x y | otherwise            = 0

また

isOne x y | (x == 1) && (y == 1) = 2
isOne x y | (x == 1) || (y == 1) = 1
isOne x y | otherwise            = 0

それを行う別の方法は、if then else式を使用することです。

isOne x y = if (x == 1) && (y == 1) 
            then 2 
            else if (x == 1) || (y == 1) then 1 else 0

または、おそらくあなたはやってみることができます

isOne x y = (go x) + (go y) where
   go 1 = 1
   go _ = 0

または他の何十もの方法のいずれか...

于 2013-02-26T23:36:08.193 に答える
4

方法 1

対になっcaseたステートメントを使用する

isOne x y = case (x, y) of 
  (1, 1) -> 2
  (1, _) -> 1
  (0, 0) -> 0
  ...

方法 2

ネストされたifステートメントを使用する

isOne x y = if x == 1 then (if y == 1 then 2 else 1) else 0
于 2013-02-26T23:36:13.227 に答える
3

次に、関数定義またはcaseタプルで直接パターン マッチングを使用します。

しかし、最も読みやすい代替手段は、IMO ですlength [ q | q<-[x,y], q==1 ]

于 2013-02-27T00:02:06.657 に答える