haskell-jp / beginners #14 at 2021-02-14 12:17:15 +0900

@channel
すごいH本 第1版 p104で、
string2digits::String->[Int]
string2digits = map digitToInt .filter isDigit …(1)
とあり、

*Main Data.Char> filter isDigit "4545-45345"
"454545345"

*Main Data.Char> map digitToInt "454545454343"
[4,5,4,5,4,5,4,5,4,3,4,3]

となるまでは分かるのですが、なぜ(1)のように書けるか
分からず、解説をお願いしたいです。
(関数合成(.)を使うと、"digitToInt .filter isDigit"がひとまとめになって、mapした各要素に適用されるイメージのため)
関数適用の優先度が最も高いので、
map digitToInt . filter isDigit

は分かりやすいように括弧を付けると
(map digitToInt) . (filter isDigit)

と評価されるからです!

逆に
“digitToInt .filter isDigit”がひとまとめになって、
を実現したい時は
map (digitToInt . filter isDigit)

と明示的に書く必要があります:eyes:
map digitToInt . filter isDigit(map digitToInt) . (filter isDigit) と同じです。関数合成 f . g は加算 m + n と同じ二項演算子なので、そうなります。
@lotz / @hexirp
ありがとうございます