答えて
のはMaybe
モナドに簡単な例をやってみましょう:
foo = do
let x = Just 1
return x
と
の両方を脱糖bar = do
x <- Just 1
return x
、我々は、参考のため
foo = let x = Just 1 in return x -- do notation desugaring
= return (Just 1) -- let
= Just (Just 1) -- definition of return for the Maybe monad
bar = let ok x = return x in Just 1 >>= ok -- do notation desugaring
= let ok x = return x in ok 1 -- definition of >>= for the Maybe monad
= return 1 -- definiton of ok
= Just 1 -- definition of return for the Maybe monad
を取得し、私はtranslation from section 3.14 of the Haskell 2010 Reportを使用しています。
番号x <- e1
は、e1 >>= \x ->
の不完全な式に変換されます。 let
の表現はちょうど普通のlet
です。または、let
と(>>=)
が同じものかどうか尋ねていますか?彼らは非常にそうではありません:(>>=)
は、モナドに包まれたものを関数に公開します。モナドに包まれたものを生成する必要があります。つまり、x <- e1
の場合、e1
のタイプはa
の場合はIO a
である必要がありますが、let x = e1
の場合はe1
のタイプはちょうどa
です。いずれの場合もx
のタイプはa
となります。
e1
がタイプMonad m => m a
の計算であると仮定すると、let x = e1
とx <- e1
は多少異なることを意味します。
let
-versionでは、do式内でx
を使用すると、タイプMonad m => m a
の値が扱われます。
do形式内でx
を使用すると、a
の値が扱われます(do-notationは暗黙的にモナド上のマッピングを処理するため)。例えば
:
e :: IO Int
f :: Int -> Int
-- the following will result in a type error, since f operates on `Int`, not `IO Int`:
g = do let x = e
return $ f x
-- the following will work:
g' = do x <- e
return $ f x
いいえ、彼らは同じではありません。例えば、
do let x = getLine
print x
が
let x = getLine in print x
に変換x
タイプIO String
を有することになるように、これは、タイプ・エラーです。その結果ではなく、計算自体を印刷するように求めています。
do x <- getLine
print x
ここ
getLine >>= \x -> print x
x
に変換計算の結果として結合し、そのタイプはString
あるので、このタイプチェックされています。それはいつものように<-
が結果、計算のに名前を結合させ、モナド結合を実行するために使用されている間
でdo
-notation、let
だけで、名前に値をバインドします。
ありがとう、非常に明確な - 別のものへのバインディング。 – guthrie
- 1. haskellの単純な単語数
- 2. 再帰関数のHaskellラベリング項目
- 3. 単純なHaskellパフォーマンス解析
- 4. 単項短絡
- 5. PostgreSQL(単純)とHaskellのMacアドレスデータ型
- 6. Haskellで各単語の長さの単語のグループを印刷するには
- 7. Haskellのエラー - 私は多項式の追加を扱う以下のHaskellコードを持って
- 8. Ltacの単項データコンストラクタのマッチング
- 9. Java:単項if - npe
- 10. C++:エラーC2675:単項「++」
- 11. cudaOccupancyMaxPotentialBlockSizeVariableSMem単項関数
- 12. NumまたはRationalのhaskellのリングの単位
- 13. Emacs用のHaskellモードでの単一式の評価方法は?
- 14. 単純な入力関数Haskell
- 15. Haskell:行単位でファイルを読む
- 16. C++での単項否定
- 17. メニューカテゴリ項目。ショートパーマリンクの単語
- 18. Wagtail StreamFieldの単一項目
- 19. wekaの単項クラステキスト分類?
- 20. Rubyの単項*演算子
- 21. 機能:単項演算子はswift3
- 22. Haskellの `reads`が複数のリスト項目を返すシナリオは何ですか?
- 23. JPA単項演算子
- 24. 単項関数chainer javascript
- 25. エラー:セマンティック問題:単項式
- 26. スウィフト単項演算エラー
- 27. ダートオーバーライド単項マイナス演算子
- 28. unix単項演算子エラー
- 29. はHaskellの
- 30. はHaskellの
'do'-expressionの' let'は普通の 'let'式だけではありません。これは 'let'ステートメントです(Haskell 2010レポート、セクション3.14)。 'let'文は' let'式にはなりませんが、それ自体は 'let'式ではありません。同様に 'e1 >> = \ x - >'は無意味です。レポートの翻訳ルールを見るだけの方がよいでしょう。 – Lambdageek