我的工作,我希望定義我在這裏已經簡化爲一個遞歸類庫:類型線程異構列表和缺省(?)類型族?
{-# LANGUAGE MultiParamTypeClasses
, FlexibleInstances #-}
data Snoc st b c = Snoc (st b) (c -> b)
data Top a = Top
class StackTo a st c where
runStack :: st c -> (c -> a)
instance StackTo a Top a where
runStack _ = id
instance (StackTo a st b) => StackTo a (Snoc st b) c where
runStack (Snoc st' cb) = runStack st' . cb
這讓我做的,例如
*Main Data.Label> let f = runStack $ Snoc (Snoc Top fst) head :: [(a,x)] -> a
*Main Data.Label> f [('a',undefined)]
'a'
但這似乎需要謹慎使用類型註釋,否則......
*Main Data.Label> let f = runStack $ Snoc (Snoc Top fst) head
<interactive>:1:1:
No instance for (StackTo a0 Top b0)
arising from a use of `runStack'
Possible fix: add an instance declaration for (StackTo a0 Top b0)
In the expression: runStack
In the expression: runStack $ Snoc (Snoc Top fst) head
In an equation for `it': it = runStack $ Snoc (Snoc Top fst) head
我覺得這些都是在this question解決同樣的問題,但是我無法在這裏適應這種解決方案。我可以使用類型族還是其他方法爲我的遞歸延續堆棧提供更加用戶友好的解決方案?
你可能想要考慮一個'class Stack st',其中包含像'type Domain st a'和'type Codomain st a'這樣的關聯類型'或者類似的東西,但是我還沒有仔細閱讀以便知道這個會爲你工作。 –