Типы с более высоким рейтингом и непредикативные типы

Я хочу реализовать следующую функцию stripPrefixBy :

-- psuedo code signature
stripPrefixBy :: forall a. [forall b. a -> Maybe b] -> [a] -> Maybe [a]
stripPrefixBy [] xs = Just xs
stripPrefixBy _ [] = Nothing
stripPrefixBy (p:ps) (x:xs) = case p x of
  Just _ -> stripPrefixBy ps xs
  Nothing -> Nothing

res :: Maybe String
res = stripPrefixBy [const (Just 0), Just] "abc"

wantThisToBeTrue :: Bool
wantThisToBeTrue = case res of
  Just "c" -> True
  _ -> False

Я пробовал использовать ImpredicativeTypes и RankNTypes , но безуспешно. Как я могу реализовать stripPrefixBy с типом, который я хочу иметь?

15
задан Thomas Eding 5 January 2012 в 08:47
поделиться