Частично применить инфиксный оператор с картой

У меня есть следующая функция g

g :: Int -> Int -> Int 
g x y = x + y * y

Я использую g следующими тремя способами, но не совсем понимаю, что они делают.

map (g 10)  [1,2,3,4,5] -- 1

map (10 ‘g‘) [1,2,3,4,5] -- 2

map (‘g‘ 10) [1,2,3,4,5] -- 3

person joelfischerr    schedule 22.06.2018    source источник


Ответы (1)


x `g` y

определяется на haskell.org как

x `g` y = g x y

Это приводит к следующему для

-- 1
map (g 10) [1,2,3,4,5] ==
map (\x -> g 10 x) [1,2,3,4,5]

-- 2
map (10 `g`) [1,2,3,4,5] ==
map (\x -> g 10 x) [1,2,3,4,5]

-- 3
map (`g` 10) [1,2,3,4,5] ==
map (\x -> g x 10) [1,2,3,4,5]

Надеюсь, это прояснило ситуацию.

person joelfischerr    schedule 22.06.2018
comment
x `g` y = \x y -> g x y неверно; это на самом деле x `g` y = g x y - person AJF; 22.06.2018
comment
\x y -> g x y не эквивалентно g x y? - person joelfischerr; 22.06.2018
comment
@joelfischerr Если g принимает два аргумента, я думаю, что первый - это функция, а второй - значение. - person Daiwen; 22.06.2018
comment
@joelfischerr Это не эквивалент. Если g :: A -> B -> C, то x `g` y :: C и (\x y -> x `g` y) :: A -> B -> C. - person AJF; 22.06.2018
comment
@joelfischerr Нет. \x y -> g x y то же самое, что (например) \a b -> g a b, что не эквивалентно g x y по той же причине. - person David Young; 22.06.2018
comment
@joelfischerr, однако, \x y -> g x y эквивалентно g (если не обращать внимания на этот мерзкий seq педантизм). Может быть, вы об этом думали. - person luqui; 23.06.2018
comment
@luqui Да, это то, о чем я думал. Спасибо! - person joelfischerr; 23.06.2018