16

今日、次のコードを入力していることに気付きました。

case () of
  _ | x < 15 -> ...
  _ | x < 25 -> ...
  _ | x < 50 -> ...
  _          -> ...

この意味は単純明快ですが、言い方が間違っcase ()ているように感じます。誰かがより良い提案をしていますか?

でブランディングしているのでx、 と書くこともできたと思いcase xます。しかし、それでも、実際にパターン マッチするものは何もありません。それはすべて警備員についてです。そして、それはまだ奇妙に感じます。

4

3 に答える 3

14

他の人はcase、存在する場合は問題なく複数の方法があると述べていますが、私は where または let ステートメントを介してローカル関数を使用します。

someFunction = do
    x <- monadicOp
    let f y | y < 5  = expr1
            | y < 15 = expr2
            | y < 25 = expr3
            | True   = expr4
    f x

これは、case ステートメント ソリューションよりも構文的にクリーンであり、多方向の if よりも移植性が高くなります。

編集:

x明確でない場合、この場合、保護された関数 ( ) を定義するときに比較される値が既にスコープ内にある場合はf、代わりに値を定義するだけで済みます。

someFunction = do
    x <- monadicOp
    let r | x < 15 = expr1
          | x < 25 = expr2
    r
于 2013-07-04T21:58:28.393 に答える
14

に問題はありませんcase ()GHC のmulti-way-ifのような非常に最近の構文および非標準拡張を使用したい場合を除き、このユースケースにはこれが最適です。

于 2013-07-04T21:22:09.670 に答える
2

遅延評価を利用して、次のようなものを考え出すことができます。

import Data.List
import Data.Maybe
import Control.Applicative

cases :: [(Bool,a)] -> a -> a
cases lst d = snd $ fromJust $ (find fst lst) <|> Just (True,d)

main = do
  let x = 20
      r = cases [(x < 15, putStr "15"),
                 (x < 25, putStr "25"),
                 (x < 50, putStr "50")] $ putStr "None"
    in
       r
于 2013-07-05T04:36:22.133 に答える