2012-10-06 3 views
13

하스켈을 처음 접했을 때 Hoogle보다 라이브러리 기능이 중복되는지 알아내는 더 좋은 방법이 있는지 궁금합니다. 포인트모나드 m => a -> [a -> m a] -> a a

케이스 : 나는

f1234 x = (return x) >>= f1 >>= f2 >>= f3 >>= f4 

처럼, 내가 함께 체인에 원하는 기능 f :: Monad a => a -> m a의 번호를 가지고 그러나 나는 오히려 그것은 매우 기본적인 것

chain :: Monad m => a -> [a -> m a] -> m a 
chain = foldl (>>=) <$> return 
f1234 = (flip chain) [f1, f2, f3, f4] 

을 써서 않는 기본 라이브러리는 chain에 해당하는 것을 제공합니까?

+1

호크의 대안은 약간의 직감으로 가장 적절한 모듈을 추측 한 다음 문서 페이지를 탐색하는 것입니다. 코드를 단축하는 다른 방법을 찾거나 기억하고 싶은 다른 유용한 기능을 찾을 수 있습니다. 이 전략은 기본 패키지와 가장 잘 작동하며 '추상화'모듈 (예 : Monad 및 Applictive, 이후 고급 Foldable 및 Traversable) 및 매개 변수화 된 패턴과 유사한 데이터 유형 (예 : Maybe, List)에 사용됩니다. 비록 당신이 더 많은 사용 된 데이터 타입 (나를 위해, Map/Set 그리고 나중에 Monad Transformers)을 위해 그것을 할 수는 있지만. – Laar

+0

'chain = foldl (>> =). return '*** *** ***, IMHO. –

답변

17

Hoogle이이 기능을 사용하고 있으며, 동일한 유형의 기능을 찾기위한 올바른 도구라고 할 수 있습니다.

평소와 달리 일반적인 장소에서 나타나지 않는다면 모호한 일부 모듈에서 가져 오기 때문에 직접 작성할 수도 있습니다. 부분적으로는 다른 모든 것들을 가져올 수 없기 때문입니다.

(제외 : 일부 패키지는 hoogle에서 검색 할 수하지 않는 것, 그래서 당신은 기능, 모듈 또는 패키지 이름을 알고있는 경우, 사용 hayoo 당신은 후에이고 hoogle는 알 수 없습니다.)

나는 Control.Monad에서

(>=>) :: Monad m => (a -> m b) -> (b -> m c) -> (a -> m c) 

를 연결하고 싶습니다. 내가 찾았을 때까지 항상 계속해서 원하는 작곡가입니다. 그것은 내 생각에 >>=보다 모나드로 작업하는 더 자연스러운 방법입니다.

, 그것은 분명 당신도 직접 사용할 수

의 : 당신이 (a -> m a) -> (a -> m a) -> (a -> m a)에 대한 hoogle 경우

f1234 = f1 >=> f2 >=> f3 >=> f4 

그것은 너무 미래 전략은 당신이 뭔가의 목록이다 결합 무언가를 찾고 있다면, 나타 두 가지를 결합하고 fold 기능 중 하나를 사용하는 기능을 검색하십시오.

따라서

chain' :: Monad m => [a -> m a] -> a -> m a 
chain' = foldr (>=>) return 

f1234 = chain' [f1,f2,f3,f4] 

또는

chain'' :: Monad m => a -> [a -> m a] -> m a 
chain'' = flip $ foldr (>=>) return 

원하는 경우

,하지만 당신은 어쨌든 괜찮습니다.

+5

'f1> => f2> => f3> => f4'는 'a -> mb'와'b -> mb '를 구성 할 수 있기 때문에'chain'[f1, f2, f3, f4] > mc'. – nponeccop