[Haskell]Ламерский вопрос по композиции
От: leonidvp Россия  
Дата: 08.02.09 07:09
Оценка:
Здравствуйте!
Начал изучать Haskell
Не могу разобраться с композицией функций
К примеру, есть:
mymult a b = a*b

Как правильно написать "умножить и преобразовать результат в строку"?

(show.mymult) 2 3
не работает
Re: [Haskell]Ламерский вопрос по композиции
От: deniok Россия  
Дата: 08.02.09 07:30
Оценка: 3 (1)
Здравствуйте, leonidvp, Вы писали:

L>Как правильно написать "умножить и преобразовать результат в строку"?


(show . mymult 2) 3

Композиция сцепляет функции одного аргумента; её тип
(.) :: (b -> c) -> (a -> b) -> a -> c

show подходит, a твой mymult нет:
show :: (Show a) => a -> String
mymult :: (Num a) => a -> a -> a
Re[2]: [Haskell]Ламерский вопрос по композиции
От: leonidvp Россия  
Дата: 08.02.09 07:35
Оценка:
Понятно
Спасибо!
Re: [Haskell]Ламерский вопрос по композиции
От: VoidEx  
Дата: 08.02.09 08:43
Оценка: 3 (1) :)
Здравствуйте, leonidvp, Вы писали:

L>Как правильно написать "умножить и преобразовать результат в строку"?


((show.).(*))

Re[2]: [Haskell]Ламерский вопрос по композиции
От: deniok Россия  
Дата: 08.02.09 08:56
Оценка:
Здравствуйте, VoidEx, Вы писали:

VE>
VE>((show.).(*))
VE>

VE>

Садист! (c) Кодт

Тогда уж ввести оператор для этой композиции
Prelude> let (.#) f g x y = f (g x y)
Prelude> (show .# mymult) 2 3
"6"
Re[2]: [Haskell]Ламерский вопрос по композиции
От: leonidvp Россия  
Дата: 08.02.09 09:00
Оценка:
Здравствуйте, VoidEx, Вы писали:

VE>
VE>((show.).(*))
VE>


Работает , хотя конструкция (show.) для меня пока не понятна. Это вариант композиции, или что-то еще?
Re[3]: [Haskell]Ламерский вопрос по композиции
От: VoidEx  
Дата: 08.02.09 09:06
Оценка:
Здравствуйте, leonidvp, Вы писали:

L>Здравствуйте, VoidEx, Вы писали:


VE>>
VE>>((show.).(*))
VE>>


L>Работает , хотя конструкция (show.) для меня пока не понятна. Это вариант композиции, или что-то еще?


Это как (2+) или (+2). Т.е. точка с show слева.
Сначала к аргументу применяется (*), получаем (*) x, потом применяется (show.), получается
(show.(*) x), т.е. изначальное выражение
Re[4]: [Haskell]Ламерский вопрос по композиции
От: leonidvp Россия  
Дата: 08.02.09 09:27
Оценка:
Здравствуйте, VoidEx, Вы писали:

VE>Это как (2+) или (+2). Т.е. точка с show слева.

VE>Сначала к аргументу применяется (*), получаем (*) x, потом применяется (show.), получается
VE>(show.(*) x), т.е. изначальное выражение

Со скрипом понял, спасибо. Пока мышление еще к ФП не привыкло
Re: [Haskell]Ламерский вопрос по композиции
От: Аноним  
Дата: 08.02.09 09:50
Оценка:
Здравствуйте, leonidvp, Вы писали:

L>К примеру, есть:

L>mymult a b = a*b

L>Как правильно написать "умножить и преобразовать результат в строку"?


Я единственный, кому кажется, что самое простое — (\x y -> show $ mymult x y)?
Re[2]: [Haskell]Ламерский вопрос по композиции
От: leonidvp Россия  
Дата: 08.02.09 09:58
Оценка:
Здравствуйте, http://migmit.vox.com/, Вы писали:

HMV>Здравствуйте, leonidvp, Вы писали:


L>>К примеру, есть:

L>>mymult a b = a*b

L>>Как правильно написать "умножить и преобразовать результат в строку"?


HMV>Я единственный, кому кажется, что самое простое — (\x y -> show $ mymult x y)?


Я неточно сформулировал исходный вопрос, мне хотелось разобраться почему не работает композиция.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.