m2とmが等しい場合、何も返さず地図を更新するIO操作(ネットワーク経由でいくつかのものを送り出す)を行いたいと思います。私は以下のコードを作って、これが何か不潔なものにリファクタリングできるかどうか(1)メッセージを送信すべきケース表現が評価されないか、少なくともメッセージが送信されないのはなぜですか?caseステートメントが評価されない
コードの下にコメントを付けると、私が望むように送信されますが、m2の値が何であるかを無視して送信されます。
main = withSocketsDo $ do
s <- socket AF_INET Datagram defaultProtocol
(q, m) <- newRq
let m2 = appendMsg "first" key m
_ = case m2 of
val | m2 == m -> do let Just messages = Map.lookup ("192.168.1.1", 4711) m in sendq s (B.pack $ unwords messages) "192.168.1.1" 4711
(q4, m4) = case m2 of
val | m2 == m -> deleteRec key q m2
| otherwise -> (q, m2)
--let Just messages = Map.lookup ("192.168.1.1", 4711) m
--sendq s (B.pack $ unwords messages) "192.168.1.1" 4711
私は_平方メートルとmが等しくないすべてのケースのために定義されていないことを知っているが、SENDQ IO()
返し、私は同じ型を返します| otherwise ->
のためにここに追加する賢明な何かを考えることができませんでした。
おかげで、私のために動作します。この場合、 '(m == m2)(fun1)'のとき、fun1の戻り値はどうなりますか?それは常に無視されますか? –
@JFritschの場合、 'when'が動作するためには戻り値は'() 'でなければなりません。しかし、それは無視されると言えるでしょう。 – dflemstr
@JFritsch:はい、そうです!あなたがそのタイプについてちょっと考えているならば、それが実際に行うことができる唯一の賢明なことでもあります。 'when'は'条件アクション=条件であればelse else return() 'のように定義され、' return() 'の部分には他にはあまりないものがあります。 'fun1'の結果に何が起こるのかをもっとコントロールしたいのであれば、あなた自身の' if ... then ... else ... 'ステートメントを書くことを検討すべきです。 – yatima2975