특정 하위 트리에 대한 관찰 공유를 방지 나는 배열에 대한 목록과 같은 콤비를 제공하는 EDSL (등 map
, zipWith
..)하스켈
일부 콤비가 랜덤 액세스로 특정 입력을 필요가있다. 예 : 다른 의해 지정된 인덱스의 데이터 어레이의 요소 따기 Gather
의 데이터 배열은 :
Gather (Manifest [10,11,12]) (Manifest [2,0,0,1,2]) = [12,10,10,11,12]
언어는 공유 회수 data-reify
패키지를 사용한다. 문제는 때때로 동일한 하위 트리에 임의 액세스를 제공해야하는 노드와 순차적으로 계산할 수있는 노드가 모두 포함되어 있다는 것입니다. 이들을 공유하게하면 후속 평가자가 중단됩니다. 나는 계속 [1,2,3]
에 대한 싶습니다 아래에있는 트리의 예를 들어
는 공유되고 있지만, Manifests
는 복구 된 그래프에서 다른 노드로 그들을 포장 : 좀 더 복잡한 예제들을 포함 할 수
[1, 2, 3]
/ \
Manifest Manifest
| |
| Map (+1)
\ /
Gather
모든 공유 노드 Map (+1) (Manifest [1,2,3])
공유 할 수에도 불구하고 (구분 될 것이다.
[1, 2, 3]
/ \
Manifest Manifest
| |
Map (+1) Map (+1)
| /|
Map (*2)/|
\ /|
Gather |
\ |
ZipWith (+)
을 내가 (Gather
참조를 간단한 경우에 대한 해결책을 찾을 경우에도), 이미 대부분의 사용 사례를 다룰 것입니다.
모든 안내를 환영합니다!
아래는 간단한 언어의 모형입니다.
module NoSharing where
data AST = Manifest [Int]
| Map (Int -> Int) AST
| ZipWith (Int -> Int -> Int) AST AST
| Gather AST --^Data
AST --^Indices
complex = ZipWith (+) gathered indexes
where
gathered = Gather (Map (*2) indexes) indexes
indexes = Map (+1) $ Manifest [1,2,3]
simple = Gather dat indexes
where
dat = Manifest [1,2,3]
indexes = Map (+1) dat
생성자가 공유해서는 안되는 것을 식별 할 수 있습니까? 예 : 모든 매니페스트는 공유되지 않아야합니까? –
하스켈은 관찰 가능한 공유를 가지고 있지 않기 때문에, 관찰 가능한 공유에 의존하는 것은 취약합니다. 일부 구현에서는 더러운 트릭을 통해 공유를 복구 할 수 있습니다. 신뢰할 수 있기를 원하면 공유를 DSL에서 명시 적으로 만들어야합니다. – augustss
@augustss 관찰 가능한 공유는 거짓 긍정이 아닌 거짓 음수를 생성 할 수 있으므로 아무 것도 깨뜨리지 않습니다. 프로그램이 더 느리게 실행됩니다. 그것은 구현하기 가장 쉬운 것 같았다.구조적으로 용어를 비교할 수 있기 때문에 암묵적인 공유를 여전히 복구 할 수 있습니다. – roldugin