関数のリストを作成し、それらを do 表記に渡して順次実行できますか?
私は現在、データのリストをマッピングすることでこれを行っていますが、何らかの方法で結果を一連の順次呼び出しとして渡すことができるかどうか疑問に思っていますか?
関数のリストを作成し、それらを do 表記に渡して順次実行できますか?
私は現在、データのリストをマッピングすることでこれを行っていますが、何らかの方法で結果を一連の順次呼び出しとして渡すことができるかどうか疑問に思っていますか?
このようなもの?
sequence [putStrLn "Hello", putStrLn "World"]
これらが関数、つまり純粋な場合は、次を使用($)
または「適用」できます。
execute functions argument = map ($argument) functions
-- execute [id,(1+),(1-)] 12 => [12,13,-11]
もちろん、これが順番に発生するという保証はありませんが、戻り値のリストを取得できます。
これらがアクション、つまり不純な場合、必要なものは次のように呼び出されsequence_
ます。
sequence_ [putStr "Hello", putStr " world", putStrLn "!"]
sequence_
自分で書くのはとても簡単です:
sequence_ [] = return ()
sequence_ (action:actions) = action >> sequence_ actions
sequence
一連のアクションを実行し、その結果を返す (アンダースコアなしの) もあります。
main = do
ss <- sequence [readFile "foo.txt", readFile "bar.txt", readFile "baz.txt"]
-- or ss <- mapM readFile ["foo.txt", "bar.txt", "baz.txt"]
これまでのところ良い答えですが、各関数を元のデータではなく前の関数の結果にも作用させたい場合は、foldl、foldl1、foldr などの折りたたみ関数を見てください。
fns = [(1-), (+2), (abs), (+1)]
helperFunction a f = f a
test1 n = foldl helperFunction n fns
また、モナド バージョンの foldM と foldM_ が必要になる場合があります。
import Control.Monad
import Data.Char
helperFunction a f = f a
prnt = \s-> do putStrLn s; return s
actions = [return, prnt, return.reverse, prnt, return.(map toUpper), prnt, return.reverse, prnt]
test2 str = foldM_ helperFunction str actions