또 다른 FP + 부작용 질문에 대해 죄송하지만 기존 답변을 찾지 못했습니다.
함수형 프로그래밍에 대한 나의 (제한된) 이해는 상태 / 부작용이 최소화되고 상태 비 저장 로직과 분리되어 있어야한다는 것입니다.
또한 IO 모나드에 대한 Haskell의 접근 방식을 수집하여 나중에 실행하기 위해 컨테이너 자체에 상태 저장 작업을 래핑하여 프로그램 자체의 범위를 벗어난 것으로 간주합니다.
나는이 패턴을 이해하려고 노력하고 있지만 실제로는 파이썬 프로젝트에서 사용할 것인지 결정하기 때문에 하스켈의 특성을 피하고 싶습니다.
조잡한 예제 수신.
내 프로그램이 XML 파일을 JSON 파일로 변환하는 경우 :
def main():
xml_data = read_file('input.xml') # impure
json_data = convert(xml_data) # pure
write_file('output.json', json_data) # impure
IO 모나드의 접근 방식이 효과적으로 수행되지 않습니까?
steps = list(
read_file,
convert,
write_file,
)
그런 다음 실제로 해당 단계를 호출 하지 않고 통역관이 그렇게하도록함으로써 책임을 완전히 배제 합니까?
또는 다른 방법으로 작성하면 다음과 같습니다.
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
그런 다음 다른 사람이 전화를 걸고 inner()
직업이 완료되었다고 말하면 main()
순수합니다.
전체 프로그램은 기본적으로 IO 모나드에 포함됩니다.
코드가 실제로 실행될 때 파일을 읽은 후의 모든 것이 해당 파일의 상태에 따라 달라 지므로 명령 구현과 동일한 상태 관련 버그로 여전히 고통받을 것이므로 이것을 유지할 프로그래머로서 실제로 무엇을 얻었습니까?
난 완전히의 혜택에 감사 감소 와 분리 내가 그와 같은 명령형 버전을 구조화하는 이유 사실상 상태 동작을 : 출력에서, 침을 순수 물건을 할, 입력을 수집합니다. 바라건대 convert()
완전히 순수하고 캐치 가능성, 스레드 안전성 등의 이점을 얻을 수 있기를 바랍니다 .
또한 모나 딕 유형이 특히 유사한 유형으로 작동하는 파이프 라인에서 유용 할 수 있지만 IO가 모나드를 사용해야하는 이유는 알 수 없습니다.
IO 모나드 패턴이 가져 오는 부작용을 처리하는 데 추가 이점이 있습니까?
main
Haskell 프로그램 의 유형은 IO ()
IO 액션입니다. 이것은 실제로 전혀 기능이 아닙니다. 그것은 A의 값 . 전체 프로그램은 언어 런타임에 수행 할 작업을 알려주는 지시 사항을 포함하는 순수한 값입니다. 모든 불완전한 것들 (실제로 IO 작업 수행)은 프로그램 범위를 벗어납니다.
read_file
) 다음 계산 의 인수로 사용할 때 write_file
입니다. 일련의 독립적 인 작업 만 수행했다면 Monad가 필요하지 않습니다.