2013-10-08 3 views
1

나는 Michael Pilquist의 우수한 상태 모나드 강의 here을 공부하고 있습니다. 나는 2 개의 질문으로 54 분을 고수했다. ofsOption[FollowerStats] 경우, ? 운영자는 어떤스칼라 상태 모나드에 대한 이해

  1. 입니까? 나는 스칼라에서 옵션에 삼항 연산자를 찾을 수 없습니다 2.10.2

  2. 어떻게 마지막 발전기 다시 checkCache 방법의 State 결과로 (히트 또는 미스 증분와) 업데이트 된 캐시를 넣어? 반환 State는 폐기 될 것으로 보인다 및 이해를위한에만 Option[FollowerStats]

를 산출 것으로 보인다.

def checkCache(u: String): State[Cache, Option[FollowerState]] = for { 
    c <- State.get[Cache] 
    ofs <- State.state { 
     c.get(u).collect { 
      case Timestamped(fs, ts) if !state(ts) => fs 
     } 
    } 
    _ <- State.put(ofs ? c.recordHit | c.recordMiss) 
} yield ofs 

이해를 돕기 위해 다시 쓰려고 시도했지만 이해하지 못했습니다.

State.get[Cache].flatMap{ c => 
    State.state{c.get(u).collect(...)}.flatMap{ ofs => 
     State.put(ofs ? c.recordHit | c.recordMiss).map{ _ => 
      ofs 
     } 
    } 
} 

는 업데이트 : 내가 답변 2 감사를 가리 키를 파악했다고 생각. 나는 yield가 근본적으로 다음과 같은 것을 깨닫지 못했다 : put에서 마지막 상태 인 s => (s,())을 가져오고, 값 유형을 ofs로 바꿔서 s =>(s,ofs)을 얻는다. 키가 수익률이 문자 그대로의 수익을 반환하지 않는다는 것을 깨닫고 있지만 State.map로 번역됩니다.

업데이트 지금 옵션 비트를 이해하십시오. 나는 그것이 국가 모나드를 파생하고 있지만 프레 젠 테이션은 여전히 ​​Scalaz로부터의 함축을 사용한다고 생각합니다.

+1

'옵션? ... | ... '비트는 암시 적 변환 (특히 암시 적 클래스'OptionOps')에서 비롯됩니다. StringOps 로의 암시 적 변환으로 인해 문자열에서 'toInt'를 호출 할 수있는 것과 같은 암시 적 변환을 이미 처리했을 것입니다. 이것은 거의 동일합니다. – Shadowlands

+0

1:06:12에서 그는 실제로 옵션을 언급합니다. 계속 지켜봐야했지만 OCD는 그것을 막았습니다. – Pengin

+0

잘하면 그 vid를 보는 다음 OCD 괴로워하는 사람은이 질문을 발견하고, 모든 코멘트를 읽고, vid의 나머지를보기 위해 똑바로 뛰어 오르는 것을 안다! :) – Shadowlands

답변

2

처음으로 삼항 연산자에 대해.

ofs.fold(c.recordMiss)(_ => c.recordHit) 

그것은 Scalaz 제공하고 암시 적 클래스로 구현 이제 (OptionOps)가 그 반환 Option에 대한 ? 방법을 제공 :

if (ofs.isDefined) c.recordHit else c.recordMiss 

또는 : 동등에

ofs ? c.recordHit | c.recordMiss 

인가 클래스는 | 메서드를가집니다. 이것은 추가 심도가 혼란의 가치가 있는지 확신 할 수없는 경우이지만 사람들은 그것을 사용하므로 가치가 있습니다. 상태 업데이트를

은 다음과 같은 간단한 예를 고려해

val inc: State[Int, Unit] = for { i <- get[Int]; _ <- put(i + 1) } yield() 
우리가 상태를 "폐기"만 단위를 산출하지만, inc의 값이 실제로 전체 인 것처럼 처음에 보일 수

상태 조작 계산 (이 경우 관련 또는 흥미있는 값을 반환하지 않는 연산) (업데이트 포함).

1
  1. ?| 연산자는 scalaz의 부울 구문에서 유래했습니다. 보세요 here at BooleanOps. 실제로는 2 개의 함수입니다. ?, Conditional|입니다.

  2. 업데이트 된 캐시는 실제로 State 동작을 실행 한 결과입니다. 동영상의 앞부분을 보면 State은 상태 작업과 초기 상태가 s 일 때 s으로 상태 작업을 실행하면 (a, s2)이되는 것으로 정의되어야합니다. (a) 계산 된 값 오퍼레이션이 실행 된 후의 새로운 상태 (s2으로 표시됨)를 전달하는 것 (튜플에 a으로 표현됨)을 전달할 수 있습니다.

그냥 초기 Cache이 모나드 행동하지만 실행될 때까지 새로운 Cache 실제로 계산되지 않습니다.

+0

이것은'BooleanOps'가 아니라'OptionOps'의'?'입니다. –

+0

@TravisBrown 사실입니다! 사과. – gpampara