2015-11-28 28 views
17

taşıma hata ile Prizma adlı ben bu oldukça kolay kullanarak Optik temsil edebilirObjektif/

string2int :: String -> Maybe Int 
int2string :: Int -> String 

dönüşüm fonksiyonları bir çift var diyelim. Ben başarısızlık nedenini temsil etmek istiyorum

stringIntPrism :: Prism String Int

Ancak, iki ayrı fonksiyonlar şeklinde bu tutmak gerekiyordu. biz her zaman bir başarısızlık bir derlemesi başarısız olduğunu varsayabiliriz çünkü bu basit örnekte Maybe için

string2int :: String -> Validation [ParseError] Int 
int2string :: Int -> String` 

böylece biz aslında bu bir Ya ya Doğrulama türünü kullanarak kodlamak zorunda değilsiniz, gayet olumlu.

Ancak benim prizma ayrıştırma ek olarak, ben olabilir, öyle ki bir araya bunlar mümkün oluşturma olmak ideal olacaktır

isOver18 :: Int -> Validation [AgeError] Int 
isUnder55 :: Int -> Validation [AgeError] Int 

bazı doğrulama, gerçekleştirmek istediğiniz, hayal

ageField = isUnder55 . isOver18 . string2Int :: ValidationPrism [e] String Int

Bu, elle inşa etmek için oldukça önemsizdir, ancak bu zaten bunu yapan Lensler/Optikler alanında gizlenen bir şey olabileceği gibi ortak bir kavram gibi görünüyor. Bunu işleyen mevcut bir soyutlama var mı?

tl;

keyfi funktor üzerinde parametreleştirilebilecek kısmi mercek/prizma/iso uygulanması yerine Belki doğrudan bağlı olmak standart bir yolu var mı dr

?.

Haskell notasyonu yukarıda daha düz olduğundan beri kullandım, ancak aslında bunu uygulamak için Scala'da Monocle kullanıyorum. Bununla birlikte, ekmett's Lens kütüphanesine özgü bir cevapla mükemmel bir şekilde mutlu olurdum.

+6

Benzer bir soru hakkında bir şekilde bir geri dönüş tartışmasını hatırlıyorum. İçinde, Edward Kmett [kavramından bahsetti] (https: //www.reddit.Normal merceklerle birleştirilebilir halde kalarak hata bilgisini rapor edebilecek "coindexed prizmalar" ın com/r/haskell/comments/34igpj/hypothetical_lens_xml_parsing_that_documents/cqv346w). Görünüşe göre, tip çıkarım sorunları nedeniyle mercek çerçevesine sığdırmak zordu, bu yüzden uygulanmadılar. – danidiaz

+0

Sanırım bir Traversal kavramı burada uygun olacaktır. –

cevap

2

Endekslenmiş optikler hakkında yakın zamanda a blog post yazdım; Bu da biz de endeksli optikler nasıl yapabileceğini araştırıyor.

Kısaca: Coindexed-optics mümkündür, ancak henüz daha fazla araştırma yapmamız gerekiyor. Özellikle, eğer bu yaklaşımı lens kodlamasıyla (Profunctor'dan VL'ye) lens kodlamasına çevirmeye çalışırsak, daha da kıllı olur (ama bence sadece 7 tip değişkenler).

Ve biz biz yapamazsınız, bu gerçekten lens kodlanmış optikler kodlanmış nasıl değiştirmeden bunu yapın. Şimdilik, doğrulama özel kitaplıklarını kullanmanız daha iyi olacaktır.

zorlukların bir ipucu vermek gerekirse: Biz Traversal s ile oluşturmak çalıştığınızda, biz

-- like `over` but also return an errors for elements not matched 
validatedOver :: CoindexedOptic' s a -> (a -> a) -> s -> (ValidationErrors, s) 

veya başka bir şey olmalı? Eğer Coindexed Prizmalar oluşturabilirsek, onların değeri onların karmaşıklığını haklı çıkarmaz; optik çerçeveye "uymaz".