2017-01-26 6 views
4

나는 내가 고양이를 사용하여 더 나은 방법이 접근하는 방법을 손실의 비트에서 오전 문자열것은 하스켈

let f = sequence [id, reverse] 
f "test" 

에 다음을 수행 할 수있다. 나는 현재

val f = List(fun1,fun2) 
val data = "test" 

f map {fun => fun(data)} 

같은 것을 사용하여이 고양이를 수행 할 수있는 시퀀스 또는 SequenceU의 구현이되어 있나요?

답변

5

구문이 약간 다르며 추가 가져 오기가 필요하고 스칼라 String이 문자 목록의 별칭이 아니기 때문에 제네릭 버전이 편리하지 않다는 점을 제외하고는 거의 동일합니다 하스켈 sequence에서

import cats.instances.function._, cats.instances.list._, cats.syntax.traverse._ 

val funcs: List[String => String] = List(identity, _.reverse) 

val f = funcs.sequenceU 

는 인자의 외부 입력 생성자 내측 유형에 대한 생성자 Monad 인스턴스의 Traversable 인스턴스를 필요로한다. 고양이의 sequence는 (이름 Traversable이 이미 표준 라이브러리에 의해 촬영 때문에) Traverse라고 거의 같 Traversable이며,보다 정확한 제약 하스켈의 sequence 만의 모나드 인스턴스가 필요하다 대신 MonadApplicative 인스턴스를 (필요 역사적 이유).

cats.implicits._을 가져올 수 있으면 좋겠지 만 그럴 경우 다른 것들이 많이 있습니다. 위의 가져 오기는 필요한 최소 유형 ​​클래스 인스턴스와 구문 확장을 제공합니다.

당신은 이런 String => List[String]입니다 f을 사용할 수 있습니다 : 당신은 2.12.1에있어 및 -Ypartial-unification 컴파일러 플래그를 사용할 수있는 경우

scala> f("test") 
res0: List[String] = List(test, tset) 

, 당신은 단지 .sequence하지 .sequenceU 쓸 수 있는지 . 이전 스칼라 버전에서 U이 필요한 이유는 긴 이야기입니다. 설명을 보려면 blog post here을 참조하십시오.