Chcę realizować następujące stripPrefixBy
funkcję:Wyższa rankingu i impredicative rodzaje
-- 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
Próbowałem za pomocą ImpredicativeTypes
i RankNTypes
ale bez powodzenia. Jak mogę zaimplementować stripPrefixBy
z typem, który chcę mieć?
Powiązane pytania/odpowiedzi: http://stackoverflow.com/questions/19982295/practical-implications-of-runst-vs-unsafeperformio – crockeea