내가 두 가지 기능 foo: Int => Option[Int]
및 bar: Int => Option[Int]
을 가지고 목록을 처리하는 데 사용할 가정?
3D 파티 라이브러리를 사용할 수 있습니다.orElse를 사용하여 Option을 반환하는 함수를 작성하는 방법은 무엇입니까?</p> <pre><code>val xs: List[Int] = ... xs flatMap {x => foo(x) orElse bar(x)} </code></pre> <p>내가 <code>xs flatMap (foo orElse bar)</code> 대신 <code>{x => foo(x) orElse bar(x)}</code> 쓸 수 :
답변
당신은을 사용할 수 있습니다 스카 파로부터의 Semigroup
타입 클라스의 연산 (|+|
)을 결합한다.
기본 세미 그룹 Option
은 콘텐츠의 세미 그룹을 사용하고 두 값이 모두있는 경우 값을 결합합니다. orElse
동작을 모방하려면 Option
을 Tags.FirstVal
태그로 묶어야합니다.
Tags.FirstVal
상태에 대한 문서 :
유형 태그 추가 할 첫 번째 피연산자를 선택하는
scalaz.Semigroup
인스턴스를 선택합니다.
당신은 포장 및 일부 F[T]
내부에서 유형 T
랩을 해제하려면 Tag
의 .subst
및 .unsubst
방법을 사용할 수 있습니다. 스칼라가 타입 유추를 조금 도와 주어야 할 것 같습니다. 모든 결합 기능에
모든는 다음과 같습니다
type F[T] = Int => Option[T]
val f = Tags.FirstVal.unsubst(
Tags.FirstVal.subst[F, Int](foo) |+|
Tags.FirstVal.subst[F, Int](bar))
그리고 flatMap
와 함께 사용하기 위해, 당신은 어떤 방법으로 List
에 Option
까지 암시 적 변환을 사용해야합니다. 그래서 flatMap
호출은 다음과 같을 수 있습니다
import scalaz._, Scalaz._
implicit val inst: Monoid[Option[Int]] =
Tags.First.unsubst(scalaz.std.option.optionFirst[Int])
val foo: Int => Option[Int] = x => if (x % 2 == 0) Some(x) else None
val bar: Int => Option[Int] = x => if (x % 3 == 0) Some(x) else None
val xs = List(1, 2, 3, 4, 5, 6, 7, 8)
xs.flatMap((foo |+| bar)(_))
지금까지 내가 이런 식으로 뭔가가 표준 라이브러리에서 사용할 수 없습니다,하지만 당신은 implicit class을 사용하여 직접 추가 할 수 있습니다 알고 :
implicit class WithOrElse[T, R](f: T => Option[R]) {
def orElse(g: T => Option[R])(x: T) = f(x) orElse g(x)
}
예 :
val foo: Int => Option[Int] = x => if (x % 2 == 0) Some(x) else None
val bar: Int => Option[Int] = x => if (x % 3 == 0) Some(x) else None
val xs = List(1, 2, 3, 4, 5, 6, 7, 8)
xs flatMap (foo orElse bar)
감사합니다 : 당신이 Option
에 대한 암시 적 Monoid
인스턴스를 오버라이드 (override)하는 경우
xs flatMap (f(_))
당신은 또한 orElse
로 |+|
작업을 할 수 있습니다. 'cats '또는 다른 3D 파티 라이브러리에서 사용할 수 있습니까? –
Michael
Foo. 약 1 분 만에 나를 때려. 그리고'foo'와'bar'에 대해서도 똑같은 정의가 있습니다. 유령 같은! Have a +1 :) –
- 1. "<xs : sequence />"는 무엇을 의미합니까?
- 2. 캐스팅 문제 x <char> ~ x <t>
- 3. C#의 <xs : annotation> 태그와 <xs : documenation> 태그를 프로그래밍 방식으로 추가하고 채우는 방법
- 4. 는 <X>
- 5. <X>
- 6. C 번호 :</p> <pre><code><ROOT> <MESSAGE> <some_fields /> <myDate> <myParameter> </MESSAGE> <MESSAGE> ... </ROOT> </code></pre> <p>내가 날짜와 myParameter = 주어진 매개 변수를 제공 MyDate가> = 모든 메시지 노드를 얻으려면 : XPath를
- 7. 내가 <code>a</code> 의미</p> <p>그래서 <code>a => [x,y,z]</code>가 <code>y</code> 및 <code>z</code></p> <p>에 <code>x</code> 접속된다 값은 키에서 진행 에지리스트가 자바 스크립트
- 8. 지정된 범위에 함수를 적용합니다. 그것은 여러 날짜에 훌륭하게 작동</p> <pre><code>rateChange <- function(x) ((last(x)-first(x))/first(x))*100 </code></pre> <p>: 변경
- 9. let-forms는 어떻게 평가됩니까?</p> <pre><code>(let ((x 4)) x (+ x 1)) </code></pre> <p>반환 <code>5</code> :
- 10. 왜 <code>val</code></p> <pre><code><form action="test"> Insert Value<input type="text" name="val"/> <input type="submit"/> </form> </code></pre> <p><br> 다음으로 걸리는 서블릿 <code>test.java</code>이
- 11. <img alt="foo" />은 <img alt="foo"></img>과 동일합니까?
- 12. 왜 (오드) 오류를 추론 할 수 없습니까? 내가 요소의 작은 합계 :</p> <pre><code>shortest :: (Num a) => [[a]] -> [a] shortest [] = [] shortest (x:xs) = if sum x < sum (shortest xs) then x else shortest xs </code></pre> <p>나에게 다음과 같은 오류를 제공하여 목록을 찾기 위해 노력하고
- 13. XML 스키마 디자인 - <xs : documentation> 원본 속성 값
- 14. 방법 그룹은 내가</p> <p><code>Foo<T>(IComparer<T> comp)</code> 내가</p> <pre><code>Foo<DateTime> (DateTime.compare) </code></pre> <p>로 전화를 할 쓰기 <DateTime>
- 15. ASP.NET MVC 4 :</p> jQuery를 스크립트에서 <pre><code>@Html.HiddenFor(x => x.IsTurkey) </code></pre> <p>내가 그것을 변경하려고 :</p> <pre><code>$("@Html.IdFor(x => x.IsTurkey)").val("False"); </code></pre> <p>자바 스크립트
- 16. 전술은 부분적으로 내가 목표</p> <pre><code>quad X Y </code></pre> <p>이 COQ
- 17. Freemarker 매크로의 매개 변수를 평가하는 방법은 무엇입니까?</p> <pre><code><#macro myMacro expr> <#local x=1> ${expr} </#local> <#local x=2> ${expr} </#local> </macro> </code></pre> <hr> <p>< @myMacro "A"/> 제공 : 우리는 간단한 프리 마커 매크로가
- 18. iParthon에서 reStructuredText (Sphinx) docstrings을 (를) 볼 수 있습니까?</p> <pre><code>help foo </code></pre> <p>나 :</p> <pre><code>foo? </code></pre> <p>을 내가 <em>슈퍼</em>이 읽으려고하는 산만 찾을
- 19. 파이썬 내가</p> <pre><code>foo = '/DIR/abc' </code></pre> <p>이
- 20. GLSL :</p> <pre><code>pow(x, 3.0f); </code></pre> <p>또는</p> <pre><code>x*x*x; </code></pre> <p>: 빠른 GLSL에 정수 지수
- 21. 는</p> <pre><code>int x = number & ((1<<8)-1); </code></pre> <p>또는 <pre><code>int x = number & 0xFF; </code></pre> <p></p>를 사용하여 당신이 첫 번째 바이트를 얻을 수있어 정수
- 22. puts를 return하는 방법은 무엇입니까?</p> <pre><code>x = puts "Hi" </code></pre> <p>풋의 결과는 전무하다 :
- 23. 전역 정적 변수와 함수의 정적 변수 비교</p> <pre><code>static Foo foo; // ... foo.func(); </code></pre> <p>: 그리고 더</p> <pre><code>Foo& GetFoo(void) { static Foo foo; return foo; } // ... GetFoo().func(); </code></pre> <p>
- 24. 차이 여기서 T : BaseObject와 푸 <BaseObject></p> <pre><code>Foo<T> where T : BaseObject </code></pre> <p>및</p> <pre><code>Foo<BaseObject> </code></pre> <p>의 차이는이 사항이 동일하지 않습니다 무엇
- 25. 하스켈 : 나는 <pre><code>map show . mapMaybe fromDynamic $ [toDyn "one", toDyn (\x -> x::Integer), toDyn 3, toDyn()] </code></pre> <p></p>을 시도했지만이 문제는 <code>fromDynamic</code>는 단형 유형으로 이동해야한다는 것입니다 <pre><code>["()"] </code></pre>
- 26. 어떻게 단어 <ul><li><div><a></a></div></li></ul>
- 27. ExtJs에서 XML 속성을 추가하는 방법은 무엇입니까?</p> <pre><code><Entity><Fields><Field><value>1777</value></Field><id></id></Fields></Entity> </code></pre> <p>Ext.data.writer.XmlView 소스를 사용 :
- 28. 라켓 :</p> <pre><code>[a | x <- xs, let a = x^2, a >= 25] </code></pre> <p>어떻게 내가 라켓의 <code>for</code> 이해의 어휘 변수를 결합 않습니다 하스켈에서
- 29. 할당을 위해 람다를 만드는 방법은 무엇입니까? 함수에</p> <pre><code>def ___(x): x.a=0 return x </code></pre> <p>또는</p> <pre><code>def ___(x): x.a=0 </code></pre> <p>:
- 30. <%= %>과 <%: %>
당신은 뭔가 더 관용적 인 것을 원했기 때문에이 대답은 약간 꺼진 것 같지만 기본 스 카즈/고양이를 사용하여 수행해야만하는 방법이라고 생각합니다. – Kolmar
대답은 괜찮습니다.)) 이것은 내가 찾고있는 것입니다. – Michael
@Michael'| + |'를'orElse'로 작동하도록 업데이트했습니다. – Kolmar