내 텍스트 편집기 Rasa에서 계속 작업 중입니다.이미 Functor 인 데이터 유형에 대해 'Fix'를 사용하는 재귀 체계는 무엇입니까?
현재 뷰포트/스플릿 (vim 스플릿과 유사) 추적 시스템을 구축 중입니다. 그것은 나무로이 구조를 표현하기 위해 나에게 자연 듯 : 이것은 위대한 작품을
data Dir = Hor
| Vert
deriving (Show)
data Window a =
Split Dir SplitInfo (Window a) (Window a)
| Single ViewInfo a
deriving (Show, Functor, Traversable, Foldable)
, 내가 나무에 내 View
의를 저장하고 내가 그들을 그들을 변경하는 동안/fmap 함수 통과 할 수 있습니다, 그것은 또한과 일 맥상 꽤 잘 렌즈 패키지!
저는 최근에 Recursion Schemes에 대해 학습 해 왔으며 트리가 재귀 적 데이터 구조이기 때문에 적절한 유스 케이스 인 것처럼 보입니다.
은 내가 Fixpoint의 버전을 구축 충분히 알아낼 관리 : 지금 펑터 인스턴스가r
에 의해 사용된다 그러나
data WindowF a r =
Split Dir SplitInfo r r
| Single ViewInfo a
deriving (Show, Functor)
type Window a = Fix (WindowF a)
을;
나는
deriving instance Functor Window
의 몇 가지 변화를 시도했다 그러나 창 유형의 동의어이기 때문에 초크.
그리고 :
newtype Window a = Window (Fix (WindowF a)) deriving Functor
그리고 너무 실패;
• Couldn't match kind ‘* -> *’ with ‘*’
arising from the first field of ‘Window’ (type ‘Fix (WindowF a)’)
• When deriving the instance for (Functor Window)
a
을 통해 트래버스/fmap 함수를 정의하는 것은 여전히 가능합니까? 아니면 recursion-schemes 프리미티브를 사용하여 이러한 작업을 수행해야합니까? Bifunctor를 구현합니까? 인스턴스 구현은 어떻게 생겼을까요? 유형의
나머지 here이다, 나는 윈도우에 대한 적절한 펑터 인스턴스를 가지고 있지 않기 때문에 컴파일되지 않습니다 프로젝트 ...
감사합니다!
예,이 *이 * 두 가지 질문을 하나. 제발 그만 하지마. – dfeuer
내가 무슨 생각을했는지 확신 할 수 없다. 하하. 당신이 처음 대답 한 이후로 새 것을 두 번째로 끌어 올리겠습니다. 감사합니다 BTW! –