Göreceli bir Scala başlangıç seviyesindeyim ve bir seçeneği geri döndürme seçeneğiyle veya Kısmi İşlev ile gerçekleştirilebilecek gibi görünen bir uygulamaya nasıl devam edileceğine dair bazı tavsiyelerde bulunmak istiyorum. Bulabildiğim tüm yayınları okudum (sorunun alt kısmına bakınız), fakat bunlar Kısmi İşlev'in kullanılması veya birinin diğerine dönüştürülmesiyle ilgili teknik detayların içerilmesi gibi görünüyor; "Koşullar X, Y, Z ise, sonra A'yı kullan, fakat C'yi de düşün" türünün bir cevabını arıyorum.Scala: Dönen işlev seçimi Seçenek veya Kısmi İşlev
Örnek kullanım örneğim, yol bulucu kitaplığı kullanan konumlar arasında bir yol araştırmasıdır. Konumların L
türünde olduğunu, yolun P
türünde olduğunu ve istenen yol arama sonucunun Iterable[P]
olacağını varsayalım. Yama arama sonucu, tüm yol bulucularına (Google haritaları gibi bir şeyde Bisiklet, Araba, Yürüyüş, Metro, vb.) Yol önerileri için belirli bir başlangıç için tanımlanabilecek veya belirlenmeyebilecekleri sorularak toplanmalıdır. son konum çifti.
(a) f: (L,L) => Option[P]
gibi bir yol bulucu tanımlamak ve sonra finders.map(_.apply(l1,l2)).filter(_.isDefined).map(_.get)
gibi bir şey aracılığıyla sonuç almak
(b) f: PartialFunction[(L,L),P] and then get the result via something like
gibi bir yol bulucu tanımlayın:
bu konuda gitmek için iki yol var gibi finders.filter (_.isDefined ((l1, l2))) .map (_.apply ((l1, l2)))
Option[P]
döndüren bir işlev kullanmak, sonuçların iki kez değerlendirilmesini engeller. Pahalı bir hesaplama için, sonuçlar önbelleğe alınmadıkça bu tercih edilebilir. Ayrıca PartialFunction
tek bir argüman beklerken Option
bir keyfi giriş imzası olabilir gibi görünüyor. Ama özellikle Scala kütüphanesi ile etkileşim gibi daha az anlık, daha "büyük resim" konuları hakkında pratik deneyime sahip birinden duymak ilgimi çekiyor. PartialFunction
kullanmak, başka yollarla ödeme yapabilecek koleksiyon API'sinin belirli yöntemlerini kullanıma sunmada önemli yararlar sağlar mı? Bu kod genellikle daha özlü olur mu?
İlgili fakat farklı sorular:
- Inverse of PartialFunction's lift method
- Is the PartialFunction design inefficient?
- How to convert X => Option[R] to PartialFunction[X,R]
- Is there a nicer way of lifting a PartialFunction in Scala?
- costly computation occuring in both isDefined and Apply of a PartialFunction