aşağıdaki stripPrefixBy
işlevi uygulamak istiyoruz. stripPrefixBy
'u sahip olmasını istediğim türden nasıl uygularım?Yükseköğretim sıralanır ve impredicative tipleri
cevap
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, forall
yapıcı tipine ayırıyor,
, 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]
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ğinres :: 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.
İlgili q/a: http://stackoverflow.com/questions/19982295/practical-implications-of-runst-vs-unsafeperformio – crockeea