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.
- 1. Java jenerikler ve sayısal tipleri
- 2. Java: Yazı Tipleri ve Pikseller
- 3. Yakut tipleri
- 4. gizlenmesi tipleri
- 5. ImageMagick: Kalın ve İtalik Yazı Tipleri?
- 6. CRTP ve typedef kullanan "Inherited" tipleri
- 7. Python, PIL; Metin Görüntü ve yazı tipleri
- 8. Kapalı tip aileleri ve garip fonksiyon tipleri
- 9. Bir dizi dizi ve dizge nasıl sıralanır?
- 10. R'de data.frame nasıl sıralanır ve filtrelenir?
- 11. Bir dizi nasıl sıralanır ve işlenir
- 12. bildirme iç tipleri
- 13. iOS Özel Yazı Tipleri
- 14. kullanın özel yazı tipleri
- 15. Android - Farklı yapı tipleri
- 16. Eclipse'de Yazı Tipleri
- 17. Agda'da boyut tipleri nelerdir?
- 18. şablonlu özyinelemeli veri tipleri
- 19. Android - Desteklenen Görüntü Tipleri
- 20. WCF kalıtsal tipleri
- 21. Bootstrap yazı tipleri klasörü
- 22. Dönüşüm dizisi tipleri
- 23. IEnumerable Listesi Nasıl Sıralanır?
- 24. Arama tablosu nasıl sıralanır?
- 25. Flex'te ArrayCollection nasıl sıralanır
- 26. BÜYÜK sözlüğü nasıl sıralanır
- 27. Bağımlılıklar dizisi nasıl sıralanır?
- 28. sql sorgusu nasıl sıralanır
- 29. Listelerden sözlükler nasıl sıralanır?
- 30. jQuery.DataTables init nasıl sıralanır?
İlgili q/a: http://stackoverflow.com/questions/19982295/practical-implications-of-runst-vs-unsafeperformio – crockeea