5

関数のリストを作成し、それらを do 表記に渡して順次実行できますか?

私は現在、データのリストをマッピングすることでこれを行っていますが、何らかの方法で結果を一連の順次呼び出しとして渡すことができるかどうか疑問に思っていますか?

4

3 に答える 3

9

このようなもの?

sequence [putStrLn "Hello", putStrLn "World"]
于 2010-03-10T19:05:51.840 に答える
5

これらが関数、つまり純粋な場合は、次を使用($)または「適用」できます。

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"]
于 2010-03-10T19:13:43.810 に答える
3

これまでのところ良い答えですが、各関数を元のデータではなく前の関数の結果にも作用させたい場合は、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 
于 2010-03-11T05:44:41.330 に答える