Başka bir FP + yan etki sorusu için özür dilerim, ama benim için buna cevap veren mevcut bir tane bulamadım.
İşlevsel programlama (sınırlı) anlayışım, durum / yan etkilerin en aza indirilmesi ve vatansız mantıktan ayrı tutulması gerektiğidir.
Ayrıca Haskell'in bu yaklaşımı bir araya getiriyorum, IO monad, bunu, programın kapsamı dışında düşünülen, daha sonraki yürütme için bir kapta durumsal eylemler sararak başarıyor.
Bu kalıbı anlamaya çalışıyorum, ama aslında bir Python projesinde kullanıp kullanmayacağınızı belirlemek için, bu yüzden eğer Haskell özelliklerini önlemek istiyorum.
Ham örnek geliyor.
Programım bir XML dosyasını JSON dosyasına dönüştürürse:
def main():
xml_data = read_file('input.xml') # impure
json_data = convert(xml_data) # pure
write_file('output.json', json_data) # impure
IO monad'ın yaklaşımı bunu etkin bir şekilde yapmak değil mi:
steps = list(
read_file,
convert,
write_file,
)
o zaman bu adımları gerçekten çağırmakla değil , tercümanın yapmasına izin vererek kendini sorumluluktan kurtarsın mı?
Ya da başka bir deyişle, yazmak gibi:
def main(): # pure
def inner(): # impure
xml_data = read_file('input.xml')
json_data = convert(xml_data)
write_file('output.json', json_data)
return inner
daha sonra başka birisinin aramasını beklemek inner()
ve işinizin bittiğini söylemek main()
saf.
Tüm program temel olarak IO monadında yer alacak.
Kod gerçekten yürütüldüğünde , dosyayı okuduktan sonra her şey o dosyanın durumuna bağlıdır, bu yüzden zorunlu uygulama ile aynı durumla ilgili hatalardan muzdarip olacak, bu yüzden bunu koruyacak bir programcı olarak gerçekten bir şey kazandınız mı?
Durumsal davranışı azaltmanın ve izole etmenin yararını takdir ediyorum , bu yüzden zorunlu sürümü bu şekilde yapılandırdım: girdileri toplamak, saf şeyler yapmak, çıktıları tükürmek. Umarım convert()
tamamen saf olabilir ve saklanabilirlik, iplik güvenliği vb.
Monadik tiplerin, özellikle karşılaştırılabilir tiplerde çalışan boru hatlarında yararlı olabileceğini de takdir ediyorum, ancak zaten böyle bir boru hattında olmadığı sürece IO'nun neden monad kullanması gerektiğini anlamıyorum.
IO monad modelinin getirdiği yan etkilerle uğraşmanın ek bir yararı var mı?
main
Bir Haskell programındaki türün IO ()
bir IO eylemi olduğuna dikkat edin . Bu aslında bir işlev değil; bu bir değer . Tüm programınız, dil çalışma zamanına ne yapması gerektiğini söyleyen talimatları içeren saf bir değerdir. Tüm saf olmayan şeyler (aslında ES eylemlerini gerçekleştirme) programınızın kapsamı dışındadır.
read_file
) sonucunu alıp bir sonrakine ( write_file
) argüman olarak kullanmanızdır . Sadece bir dizi bağımsız eyleminiz olsaydı, bir Monad'a ihtiyacınız olmazdı.