Функциональное программирование, Haskell применяет функцию к списку переменных - PullRequest
1 голос
/ 22 февраля 2012

У меня есть функция типа Csp -> Var -> Int -> Csp, и я хочу применить эту функцию к списку [Var], просто интересно, может ли кто-нибудь мне помочь, я совершенно сбит с толку!

Ответы [ 6 ]

7 голосов
/ 22 февраля 2012

Из вашего комментария звучит так, будто вы хотите сгиб, например:

foo :: Csp -> Var -> Int -> Csp -- your function

bar :: Csp -> [Var] -> Int -> Csp
bar c0 vs x = foldl (\c v -> foo c v x) c0 vs

Хотя, возможно, стоит немного изменить порядок аргументов, чтобы сделать его более подходящим для частичного применения:

foo :: Int -> Csp -> Var -> Csp

bar :: Int -> Csp -> [Var] -> Csp
bar x = foldl (foo x)
2 голосов
/ 22 февраля 2012

То, что вы хотите, это сгиб. Foldl имеет подпись foldl :: (a -> b -> a) -> a -> [b] -> a, поэтому в вашем случае вы хотите, чтобы a было Csp ч и b было Var, давая вам тип foldl :: (Csp -> Var -> Csp) -> Csp -> [Var] -> Csp. Для первого аргумента вы просто передаете ему что-то вроде \csp var -> f csp var yourFixedInt, где f - ваша функция.

Если вы не знакомы с fold s, для чего это применимо, для каждого var в вашем списке Var s, функции, которую вы передаете (в данном случае только ваша функция с * 1014) * аргумент исправлен) для Csp аккумулятора и var.

(Есть намного лучшие объяснения складок вокруг, но я решил включить хотя бы короткий комментарий)

1 голос
/ 22 февраля 2012

Я думаю, вам нужен фолд.

answer :: (Csp -> Var -> Int -> Csp) -> Csp -> [Var] -> Int -> Csp
answer f csp vs i = foldl (\csp' v -> f csp' v i) csp vs
1 голос
/ 22 февраля 2012

Вы хотите фолд, или мне так кажется.Предположим, у вас есть функция f

f :: Csp -> Var -> Int -> Csp
vars = [ ..... ] :: [Var]
i :: Int -- the constant int argument to f

foldl g vars where g c v = f c v i
1 голос
/ 22 февраля 2012

http://zvon.org/other/haskell/Outputprelude/map_f.html

Это может быть то, что вы ищете, нет?

0 голосов
/ 22 февраля 2012

map берет функцию и применяет ее к списку значений.В качестве простого примера, если у меня есть функция f x = x + 5 и список l = [1,2,3], то map f l вернет [6,7,8]

с учетом f :: Csp -> Var -> Int -> Csp и l :: [Var], вы должны написать

map (\x -> f csp x int) l -- note that the variable names (like "csp") can be anything

, который будет иметь тип :: Csp -> Int -> Csp.Другими словами, он вернет список функций.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...