F#: 게으른 평가의 이상한
-
20-09-2019 - |
문제
다음 코드가 주어지면 :
let bar =
lazy(
printfn "bar"
())
let foo =
lazy(
printfn "foo"
bar)
대화식 창 (매번 재설정)에서
내가 전화 할 때 let res = foo.Force ()
나는 얻다:
foo
val res : Lazy<unit> = Value is not created.
내가 전화 할 때 foo.Force()
, 나는 얻다:
foo
bar
val it : Lazy<unit> =
<ToString exception: Object reference not set to an instance of an object.>
{IsValueCreated = false;
Value = null;}
두 경우 모두 "foo"만 인쇄 할 것으로 예상했지만 두 번째 경우는 "foo nbar"를 인쇄합니다. 여기서 무슨 일이야?
해결책
F#의 어떤 버전이 있습니까? 이것은 아마도 고정 된 버그처럼 들릴 것입니다. FSI가 Lazy 유형 < 'a>의 값을 인쇄 할 때, 어느 시점에서 나는 ToString ()이 Lazy에게 인쇄하는 데 사용되는 값을 표시하는 반면, 그렇지 않습니다.
다른 팁
문제는 구현 세부 사항 인 것 같습니다. 게으른 참조는 언제 값을 계산했는지 어떻게 알 수 있습니까? 아마도 참조가 아닌 경우 ().
유형이 있습니다 Lazy<unit>
그다지 의미가 없습니다. 노력하다
let bar =
lazy(
printfn "bar"
42)
제휴하지 않습니다 StackOverflow