2012-01-05 16 views

cevap

20

imzanız sorun stripPrefixBy geçirilen liste bağımsız değişken olarak bir belli alan işlevler listesi olarak ilan etti ve ardından herhangi bir b Arayan çekmeleri için bir Maybe b üretmek olmasıdır. Listedeki işlevlerin geri dönmesine izin verilen tek değerler , Nothing ve Just ⊥'dur. yani orada, forallyapıcı tipine ayırıyor,

:

impredicative polimorfizm kullanırken, demek ki

, forall bir varoluşsal niceliksel türü ile yaptığı aynı şeyi anlamına gelmez

data MyType = forall a. Foo a 
Foo :: forall a. a -> MyType 

Ancak burada, işlev kelimenin tam anlamıyla forall b. a -> Maybe b türünde olması gerektiğini söylüyor. neden bunu istiyorsun",

stripPrefixBy :: [exists b. a -> Maybe b] -> [a] -> Maybe [a] 
5

Başka yanıttır gibi ben UHC doğrudan istediğiniz türü ifade destekler inanıyoruz

{-# LANGUAGE ExistentialQuantification #-} 

data Pred a = forall b. Pred (a -> Maybe b) 

stripPrefixBy :: [Pred a] -> [a] -> Maybe [a] 
stripPrefixBy [] xs = Just xs 
stripPrefixBy _ [] = Nothing 
stripPrefixBy (Pred p:ps) (x:xs) = case p x of 
    Just _ -> stripPrefixBy ps xs 
    Nothing -> Nothing 

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

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

: Burada

varoluşsal türünü kullanarak düzeltilmiş örnek bu tür için? " Aynı sonuç türüne sahip fonksiyonların listesini (stripPrefixBy ilk argüman) sınırlamak için mutlu bütün iseniz, örneğin

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

kullanmak ve sonra stripPrefixBy aşağıdaki Haskell98 türünü verebiliriz:

stripPrefixBy :: [a -> Maybe b] -> [a] -> Maybe [a] 

Aynı şekilde, ilk argüman işlevlerin sonuçları kullanılamaz ettiği gözlemlenebilir (başka bir şey tip "b" bahseder), bu yüzden siz de yüklemler bir listeniz olabilir:

stripPrefixBy :: [a -> Bool] -> [a] -> Maybe [a] 
stripPrefixBy [] xs = Just xs 
stripPrefixBy _ [] = Nothing 
stripPrefixBy (p:ps) (x:xs) = case p x of 
    True -> stripPrefixBy ps xs 
    False -> Nothing 

res :: Maybe String 
res = stripPrefixBy (map (isJust.) [const (Just undefined), Just]) "abc" 

isJust :: Maybe a -> Bool 
isJust (Just _) = True 
isJust Nothing = False 

Ama belki bu soru sahip olduğunuz daha karmaşık bir sorunun özeti ve daha basit yanıt işe yaramayacak mı? Her şey mümkün olduğunca basit olmalı, ancak daha basit değil.