関数があるとしましょう:
isOne :: Int -> Int -> Int
isOne x y =
次に、if x == 1
and y != 1
then が返され1
(パラメーターの 1 つが 1 に等しい)、if x == 1
and y == 1
it が返さ2
れ (両方が 1 であるため)、if x != 1
and y != 1
it が返されます0
。
if ステートメント (またはケースを使用) で複数のチェックを行う方法がわかりません。
関数があるとしましょう:
isOne :: Int -> Int -> Int
isOne x y =
次に、if x == 1
and y != 1
then が返され1
(パラメーターの 1 つが 1 に等しい)、if x == 1
and y == 1
it が返さ2
れ (両方が 1 であるため)、if x != 1
and y != 1
it が返されます0
。
if ステートメント (またはケースを使用) で複数のチェックを行う方法がわかりません。
英語を 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)
これを行う最も簡単な方法は、パターン マッチを使用することです。ケースごとに関数を定義できます。これは、発生した順序で解釈されます。
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
または他の何十もの方法のいずれか...
対になっcase
たステートメントを使用する
isOne x y = case (x, y) of
(1, 1) -> 2
(1, _) -> 1
(0, 0) -> 0
...
ネストされたif
ステートメントを使用する
isOne x y = if x == 1 then (if y == 1 then 2 else 1) else 0
次に、関数定義またはcase
タプルで直接パターン マッチングを使用します。
しかし、最も読みやすい代替手段は、IMO ですlength [ q | q<-[x,y], q==1 ]
。