この関数で「。」が使用されている理由を教えてください。?
longestProductLen :: [(Barcode, Item)] -> Int
longestProductLen = maximum . map (length . fst . snd)
この関数で「。」が使用されている理由を教えてください。?
longestProductLen :: [(Barcode, Item)] -> Int
longestProductLen = maximum . map (length . fst . snd)
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
マッピングする場合は、タイプのデータを受け入れる必要があることに注意してください。f
f
(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から)であることがわかりました。
.
関数合成です。次のように定義できます。
(.) :: (b->c) -> (a->b) -> a -> c
f . g = \x -> f (g x)
他の答えは良いですが、読みやすくするために、方程式の両側に変数を精神的に追加し、.
a$
または括弧で置き換えることができるので、例は次のようになります。
longestProductLen xs = maximum $ map (\y -> length $ fst $ snd y) xs
参考までに:元のバージョンは「ポイントフリースタイル」と呼ばれています(「ポイント」はドットではなく変数です)。