내가 작업중인 것을 위해 일반적인 스택을 구현해야한다. 이 스택은 다른 유형의 요소를 보유 할 수 있어야합니다. 예를 들어, (1, 'c', True, "Strings"). 지원되는 기능은 top, pop 및 push입니다.일반 '타입이없는'Haskell의 스택
튜플이 가장 기본적인 아이디어입니다.
push x s = (x,s)
pop s = snd s
top s = (fst s, s)
하지만 빈 스택도 지원해야합니다. 여기서 pop과 top은()에 정의되어 있지 않습니다. 그래서 새로운 유형을 만들려고했습니다. 내가 함께이 문제를 해결하는 경우
Couldn't match expected type ‘b’ with actual type ‘x’
because type variable ‘x’ would escape its scope
This (rigid, skolem) type variable is bound by
a pattern with constructor
Cons :: forall x. (x, Stack) -> Stack,
in a case alternative
at try.hs:11:9-18
Relevant bindings include
x :: x (bound at try.hs:11:15)
top :: Stack -> (Either() b, Stack) (bound at try.hs:9:1)
In the first argument of ‘Right’, namely ‘x’
In the expression: Right x
:
data Stack x = Empty | forall y. Cons (x, Stack y)
나는 팝에 대해 동일한 오류가 여기에
data Stack = Empty | forall x. Cons (x, Stack)
push x s = Cons (x,s)
pop s = case s of
Empty -> Left s
Cons (x, y) -> Right y
top s = case s of
Empty -> (Left(), s)
Cons (x,y) -> (Right x, s)
는, 최고는 나에게 오류를 제공합니다.
나는이를 추가하는 시도 :type AnyStack = forall x. Stack x
그러나 다시 비슷한 오류 얻을 :
이Couldn't match expected type ‘b’ with actual type ‘Stack y’
because type variable ‘y’ would escape its scope
This (rigid, skolem) type variable is bound by
a pattern with constructor
Cons :: forall x y. (x, Stack y) -> Stack x,
in a case alternative
at try.hs:8:9-19
Relevant bindings include
y :: Stack y (bound at try.hs:8:18)
pop :: Stack t -> Either (Stack t) b (bound at try.hs:6:1)
In the first argument of ‘Right’, namely ‘y’
In the expression: Right y
사람이 스택의 이런 종류의 권리 유형 서명 또는 형식 정의 좀 도와 수를 ? 아니면 이것에 관련된 좋은 참고 서를 가르쳐 주시겠습니까?
고맙습니다.
편집 :
나는 또한이 스택에 대한 get 함수를 포함 할 수있을 것입니다 경우가 완벽 할 것입니다. 정수 i와 스택 s가 주어지면 get은 s의 i 번째 요소를 반환합니다. 나는 언젠가 밀어 넣기, 팝과 윗부분을 정렬 해 놓았지만 아마도 나 자신을 할 수있을 것이라고 기대했다. 이 사람들에 관한 아이디어가 있습니까?
! 이것은 꽤 놀라운 구현입니다! –
이 스택에 get 함수를 포함시킬 수 있다면 완벽 할 것입니다. 정수 i와 스택 s가 주어지면 get은 s의 i 번째 요소를 반환합니다. 나는 언젠가 밀어 넣기, 팝과 윗부분을 정렬 해 놓았지만 아마도 나 자신을 할 수있을 것이라고 기대했다. 이것에 관한 아이디어가 있습니까? –
@ shivanker.goel이 구현으로 관리하기가 매우 어려워졌습니다. 인덱스가 컴파일 타임에만 결정되는 경우 나쁘지는 않지만 런타임에 인덱스를 선택하면 엄청나게 어렵습니다. 이 시점에서, 이것은 기본적으로 Haskell에서 작동하지 않습니다. – Carl