Понимание сокращения Eta

При запуске hlint функция weightDelta постоянно предлагает уменьшить Eta. Я прочитал другой связанный с этим вопрос, но я не могу передать понимание в этом случае.

module StackQuestion where

import qualified Data.Vector as V

type Weights = V.Vector Double
type LearningRate = Double

weightDelta :: LearningRate -> Double -> Double -> Weights -> Weights
weightDelta n r y ws = V.map update  ws
        where update w = diff * n * w
              diff = r - y

Каждое изменение, которое я пытаюсь сделать, чтобы «уменьшить» его до синтаксиса без точек, просто ломает его. Где нужно внести изменения, и есть ли какая-то интуиция или уловка, чтобы избежать внушения эта редуцировать в будущем?


person enjoylife    schedule 08.07.2012    source источник
comment
Обратите внимание, что одно преобразование eta-reduce применяется к одному единственному аргументу, в частности, к последнему явному аргументу, который в вашем случае равен «ws».   -  person Chris Kuklewicz    schedule 08.07.2012
comment
Как примечание, эти сокращения (и многое другое) могут выполняться автоматически программой pointfree (cabal install pointfree), так что вы можете экспериментировать, чтобы проверить/расширить свое понимание. (например, там написано, что полностью бесточечной версией является weightDelta = (((V.map . (*)) .) .) . (. (-)) . (.) . (*).)   -  person huon    schedule 09.07.2012


Ответы (1)


Вы не сможете легко получить свободный синтаксис, но то, что вы можете сделать немедленно, это просто η-уменьшить ws.

weightDelta :: LearningRate -> Double -> Double -> Weights -> Weights
weightDelta n r y = V.map update
        where update w = diff * n * w
              diff = r - y

Вы также можете сделать что-то вроде

        where update = (δ *)
              δ = n * (r - y)

но это довольно спорно.

person leftaroundabout    schedule 08.07.2012
comment
Ну, я не получаю такой ошибки - не с модулем, который вы указали в своем вопросе. Какой компилятор вы используете? - person leftaroundabout; 08.07.2012