関数を 2 回適用し、結果をタプルにバインドできます。
let foo :: Num a => a -> a
foo x = x + 1
let (x,y) = (foo 10, foo 20)
do
これは、ブロック内では実行できません (少なくとも、適切に実行する方法がわかりません) 。
let bar :: Num a => a -> IO a
bar x = do
let y = x + 1
return y
let test :: Num a => IO a
test = do
(x,y) <- (bar 10, bar 20)
return y
GHCI REPL と入力すると、次のエラーが発生しました。
:29:15:
Couldn't match expected type ‘IO a1’ with actual type ‘(t0, a)’
Relevant bindings include
test :: IO a (bound at :28:5)
In the pattern: (x, y)
In a stmt of a 'do' block: (x, y) <- (bar 10, bar 20)
In the expression:
do { (x, y) <- (bar 10, bar 20);
return y }
:29:24:
Couldn't match type ‘(,) (IO a0)’ with ‘IO’
Expected type: IO (IO a1)
Actual type: (IO a0, IO a1)
In a stmt of a 'do' block: (x, y) <- (bar 10, bar 20)
In the expression:
do { (x, y) <- (bar 10, bar 20);
return y }
In an equation for ‘test’:
test
= do { (x, y) <- (bar 10, bar 20);
return y }
私は明らかにもっと冗長でそれを解決できます:
let test' :: Num a => IO a
test' = do
x <- bar 10
y <- bar 20
return y
test
のようにせずに表現する正しい方法はありtest'
ますか?