2012-02-12 2 views

답변

8

어떤 Stream이 나타내는 것은 lazy이며 잠재적으로 무한한 목록입니다. SML이 eager이므로 약간 둥근 방식으로 수행해야합니다. 어떻게 일반 목록에서

것을 우선 보자 작동 :

datatype 'a list = [] | :: of 'a * 'a list 

단점은 두 부분으로 구성

  • 목록
  • 목록
의 나머지 부분의 첫 번째 요소

게으른 목록에서 꽤 유사합니다. 여기

datatype 'a Stream = Nil | Cons of 'a * (unit -> 'a Stream) 

단점은 다음과 같이 구성 목록

  • 첫번째 요소
  • ()
평가 때 목록 의 나머지 부분을 생성하는 기능

그럼, 원리는 거의 동일 함을 알 수 있습니다. 작업하기가 더 어려워서. 예를 들어 목록에서

살펴 보자 :

fun succ n = Cons (n, fn() => succ (n+1)) 
val naturals = succ 0 

이 무엇을 생산 하는가? 그것을 살펴 봅시다.

naturalssucc 0으로 정의되고, 차례로 Cons(0, fn() => succ 1)으로 정의된다. 이 목록에서 첫 번째 요소는 0입니다.

이제 한 걸음 더 나아가십시오. 우리의 Cons의 두 번째 부분 인 fn() => succ 1()으로 평가하면 succ 1이고, 차례로 Cons(1, fn() => succ 2)입니다. 이제 목록의 두 번째 요소가 1임을 알 수 있습니다.

이 과정을 반복하면 목록이 무한 목록 [0, 1, 2, ...]을 나타냅니다.

또한

val firstnats = take 10 naturals; 

을하려고하면 무엇을 얻을보고하여이를 확인할 수 있습니다.

1

이 스트림의 두 생성자 중 하나입니다. 그 스크린 샷의 두 번째 라인을보십시오 - 그것이 단점입니다.

관련 문제