2013-07-25 2 views
6

의 목록에 값을 적용하는 것은 :어떻게 달성하고 싶습니다 어떤 기능

map :: (a -> b) -> [a] -> [b] 

내가 Hoogle 시도했다 :

apply :: a -> [a -> b] -> [b] 

이지도의 역의 종류 , 그러나 아무 소용이 없습니다. 누구나 하스켈에서 이것을 수행하는 깨끗한 방법을 제안 할 수 있습니까? 더 명확 할 수있다

apply a = map (\f -> f a) 

을 말하는 간결한 방법입니다

답변

15
apply :: a -> [a -> b] -> [b] 
apply a = map ($ a) 

.

3

\a -> map ($ a) 확실히 괜찮지 만, 더 좋은 아마도 아직 약간은 Applicative 방법이다 : 인스턴스 <*> :: [a] -> [a->b] -> [b]있다

<**> :: Applicative f => f a -> f (a -> b) -> f b 

이있다. 당신이 원하는 것처럼 많이 보입니다! a 값을 싱글 톤 목록에 넣으면됩니다. Applicative : pure에 전용 함수가 있습니다.

apply :: Functor f => a -> f (a -> b) -> f b 
apply a = fmap ($ a) 
: Applicative 그것을하지 않은 당신은 가능한 가장 일반적인 서명이처럼 보이게하기 때문에

apply :: Applicative f => a -> f (a -> b) -> f b 
apply = (<**>) . pure 

사실이지만, 차라리, 바인딩이 최상위에 대한 a -> [a->b] -> [b]에 서명을 제한 할 것

정말, 내 솔루션은 아마도 당신이 어떤 파이프 라인에있을 때, 나는 최선을 apply을 정의 할 수 있지만 코드에서 직접 (<**>) . pure을 사용하면 가장 좋습니다.

+2

적용법에 따라 '((<**>). 순수) yu == u <*> 순수 y == 순수 ($ y) <*> u == fmap ($ y) u'는 모든'적용 ' 마지막은 좀 더 일반적입니다. –

관련 문제