3

私がデバッグするように与えられた Haskell プロジェクトでは、map1 つのパラメーター (リスト) のみで使用されるコード内のインスタンスが渡されます。

例えば

printReports :: [Report] -> IO ()
printReports = putStrLn . unlines . map show

printRuns' :: [Run] -> IO ()
printRuns' = putStrLn . unlines . map showRecipes'

mapこの文脈で何を意味するか/何をするか?

4

4 に答える 4

10

地図の種類:

map :: (a -> b) -> [a] -> [b]

したがって、atoからの関数bと type のリストを提供する必要がありますa

あなたの例では、関数はすでに与えられている ( showand showRecipes') ため、printReportsandprintRuns'のリストのみを提供する必要があります。

そこで起こったことは、部分的に適用された関数と呼ばれます。ここを参照して ください http://www.haskell.org/haskellwiki/Partial_application

于 2013-02-14T16:53:14.007 に答える
10

他の人が言ったようにmap show、部分的に適用される機能であり、それを読むことは良い考えです. しかし、あなたが与えたコードはポイントフリースタイルのプログラミングの例でもあり、そのように理解する方が簡単かもしれません. 関数は次のprintReportsように書くこともできます。

printReports xs = (putStrLn . unlines . map show) xs

または同等に、

printReports xs = putStrLn . unlines . map show $ xs

一般的に言えば、以下はすべて同等です。

myFunction x y z = someExpression x y z
myFunction x y = someExpression x y
myFunction x = someExpression x
myFunction = someExpression

これは少し単純化しすぎていますが、これで始めることができます。

于 2013-02-14T17:09:48.347 に答える
3

経験則として、このようなものがあれば...

foo = bar . foobar . blafasel

...精神的にドットを置き換えて$、両側に変数を追加できます

foo x = bar $ foobar $ blafasel x

これが機能する理由は他の回答で既に説明されていますが、このトリックは、あまり考えずにポイントフリースタイルを読むのに役立ちます.

于 2013-02-15T07:55:04.343 に答える
2

このコンテキスト マップでは、リストにある各レポートに show 関数を適用します。結果は [show report0, show report1,... ,show reportn] のようになります。

別の言い方をすれば、レポートのリストと関数マップを渡し、リスト内のレポートのタイプの各アイテムの マップを show 関数に渡します。

あなたの関数が構築される方法は、ポイントフリースタイルに対応しています。

于 2013-02-14T17:17:57.390 に答える