1

この関数で「。」が使用されている理由を教えてください。?

     longestProductLen :: [(Barcode, Item)] -> Int
     longestProductLen = maximum . map (length . fst . snd)
4

3 に答える 3

6
longestProductLen :: [(Barcode, Item)] -> Int
longestProductLen = maximum . map (length . fst . snd)

.は関数の合成なので、maximum. map fはマップを意味fし、次に最大値を取ります。たとえば、fがの場合、次の(+5)ようになります。

  ( maximum .map (+5) ) [1,2,3,4] 
= maximum (map (+5) [1,2,3,4])
= maximum [6,7,8,9]
= 9

あなたが与えたコードでは、.もで使用されてい(length . fst . snd)ます。

以来、そのリストにlongestProductLen :: [(Barcode, Item)] -> Intマッピングする場合は、タイプのデータを受け入れる必要があることに注意してください。ff(Barcode, Item)

、それsndはそれにアイテムを与えます、そしてfst、それはそれでなければなりませんtype Item = (Product,???)。何がわからないの?ですが、それはあなたの機能にとって重要ではありません。推測しDoubleます。

次にlength、を取りますtype Product = [????]。文字列などだと思い[Char]ますが、長さは関係ありません。

それでは、いくつかのサンプルデータでそれを実行してみましょう。

  (length . fst . snd) ("|| ||| | ||| | || |||| | |", ("Gruyere",1.05))
= (length . fst)  (snd ("|| ||| | ||| | || |||| | |", ("Gruyere",1.05)) )
= (length . fst) ("Gruyere",1.05)
= length ( fst ("Gruyere",1.05) )
= length "Gruyere"
= 7

それをまとめると

  longestProductLen [("|| ||| | ||| | || |||| | |", ("Gruyere",1.05)),
                     ("| ||| || ||| ||  |||| || |", ("Emmental",0,97)),
                     ("||||| ||| ||| ||  | || |||", ("Gouda",1,21))]
= maximum . map (length . fst . snd) 
                    [("|| ||| | ||| | || |||| | |", ("Gruyere",1.05)),
                     ("| ||| || ||| ||  |||| || |", ("Emmental",0,97)),
                     ("||||| ||| ||| ||  | || |||", ("Gouda",1,21))]
= maximum [7,8,5]
= 8

したがって、製品の最長の長さは8(Emmentalから)であることがわかりました。

于 2012-11-07T23:28:56.530 に答える
4

.関数合成です。次のように定義できます。

(.) :: (b->c) -> (a->b) -> a -> c
f . g = \x -> f (g x)
于 2012-11-07T22:44:02.683 に答える
1

他の答えは良いですが、読みやすくするために、方程式の両側に変数を精神的に追加し、.a$または括弧で置き換えることができるので、例は次のようになります。

longestProductLen xs = maximum $ map (\y -> length $ fst $ snd y) xs

参考までに:元のバージョンは「ポイントフリースタイル」と呼ばれています(「ポイント」はドットではなく変数です)。

于 2012-11-09T08:45:59.580 に答える