I guess I still fail to see the advantage of this over Haskell:
dot = (sum.) . zipWith (\*)
p = [2, 3, 4]
q = [1, 0, 2]
p `dot` q
Like, the only difference to my eyes is using names for sum/zipWith, and not having the lifts/restructuring happen "magically"