私はHaskellのScalaの同等(再び)
do
x <- [1, 2, 3]
y <- [7, 8, 9]
let z = (x + y)
return z
が
for {
x <- List(1, 2, 3)
y <- List(7, 8, 9)
z = x + y
} yield z
としてScalaで表される。しかし、特にモナドとすることができ、Haskellはしばしば内のステートメントを持っていることを知っていますdo
ブロックは<-
または=
に対応していません。たとえば、Parsecを使用して文字列から何かを解析するコードの例を次に示します。
-- | Parse contents of 'str' using 'parser' and return result.
parseFromString :: GenParser tok st a -> [tok] -> GenParser tok st a
parseFromString parser str = do
oldPos <- getPosition
oldInput <- getInput
setInput str
result <- parser
setInput oldInput
setPosition oldPos
return result
あなたが見ることができるように、それが位置して入力を保存し、文字列のパーサを実行し、その結果を返す前に入力し、位置を復元します。
setInput str
、setInput oldInput
、setPosition oldPos
をScalaに翻訳する方法がわかりません。私はちょうど
for {
oldPos <- getPosition
oldInput <- getInput
whyAmIHere <- setInput str
result <- parser
...
} yield result
のようなので、私は<-
を使用することができでナンセンス変数を置けば、それは働くだろうと思いますが、私はそれはケースだか分からないと、それが正しければ、私がしなければならないことを確信していますこれを行うためのより良い方法です。
ああ、あなたはこの質問に答えることができます。あなたはもう1つ答えてもらえますか?黒い魔法のように感じる前に、モナドを何度見なければなりませんか? :-)
ありがとう! Todd
変数の使用を計画していない場合は、その名前をアンダースコアで置き換えることができます: '_ < - setInput str' – incrop
これはスカラーのような方法です。 – TOB
確かに可能かもしれませんが、これらのステートメントをforの本体に移動すると、より自然なように見えるかもしれません。実際にプロシージャスタイルに進むことができます。 – dividebyzero