[user-interface] 기능적인 GUI 프로그래밍이 가능합니까? [닫은]

나는 최근에 FP 버그를 발견했으며 (Haskell을 배우려고 노력 중), 지금까지 본 것 (일류 함수, 게으른 평가 및 기타 모든 장점)에 깊은 인상을 받았습니다. 나는 아직 전문가는 아니지만 기본 알고리즘보다 명령 적으로 “기능적으로”추론하기가 더 쉽다는 것을 이미 발견했다 (그리고 내가 필요한 곳으로 돌아가는 데 어려움을 겪고있다).

그러나 현재 FP가 평평하게 떨어지는 영역 중 하나는 GUI 프로그래밍입니다. Haskell 방식은 명령형 GUI 툴킷 (GTK + 또는 wxWidgets 등)을 래핑하고 “do”블록을 사용하여 명령형 스타일을 시뮬레이션하는 것 같습니다. F #을 사용하지는 않았지만 .NET 클래스와 함께 OOP를 사용하여 비슷한 것을 수행한다는 것을 이해합니다. 분명히 현재의 GUI 프로그래밍은 IO와 부작용에 관한 것이므로 당연히 기능적인 프로그래밍은 대부분의 최신 프레임 워크에서는 불가능합니다.

내 질문은 GUI 프로그래밍에 대한 기능적 접근 방식이 가능합니까? 실제로 이것이 어떻게 보일지 상상하는 데 어려움을 겪고 있습니다. 실험이나 다른 방법으로 이런 종류의 것을 시도하는 프레임 워크 (또는 기능적 언어를 위해 처음부터 설계된 프레임 워크)를 아는 사람이 있습니까? 아니면 GUI 부분에는 OOP를, 논리에는 FP를 사용하여 하이브리드 방식을 사용하는 솔루션입니까? (나는 단지 호기심을 요구하고있다. 나는 FP가 “미래”라고 생각하고 싶지만 GUI 프로그래밍은 꽤 큰 구멍처럼 보인다.)



답변

Haskell 접근 방식은 명령형 GUI 툴킷 (GTK + 또는 wxWidgets 등)을 래핑하고 “do”블록을 사용하여 명령형 스타일을 시뮬레이션하는 것으로 보입니다.

이것이 바로 “Haskell 방식”이 아니라 명령형 인터페이스를 통해 명령형 GUI 툴킷에 가장 직접적으로 바인딩하는 방법입니다. Haskell은 상당히 두드러진 바인딩을 가지고 있습니다.

대부분 Haskell에서 주로 기능적 반응성 프로그래밍을 사용하는 GUI에 대한 완만하게 성숙하거나 실험적인 순전히 기능적 / 선언적 접근 방식이 있습니다.

몇 가지 예는 다음과 같습니다.

Haskell, Flapjax, http://www.flapjax-lang.org/에 익숙하지 않은 분들을 위해 JavaScript 기반의 기능적 반응성 프로그래밍을 구현했습니다.


답변

내 질문은 GUI 프로그래밍에 대한 기능적 접근 방식이 가능합니까?

찾고자하는 핵심 단어는 “기능적 반응성 프로그래밍”(FRP)입니다.

Conal Elliott와 일부 다른 사람들은 FRP에 대한 올바른 추상화를 찾으려고 약간의 코티지 산업을 만들었습니다. Haskell에는 몇 가지 FRP 개념 구현이 있습니다.

Conal의 최신 “Push-Pull Functional Reactive Programming” 논문 으로 시작하는 것을 고려할 수 있지만 haskell.org 사이트 에서 링크 된 다른 (구형) 구현이 몇 가지 더 있습니다 . Conal은 전체 영역을 다루는 요령을 가지고 있으며, 그의 논문은 이전의 내용을 참조하지 않고도 읽을 수 있습니다.

이 접근법이 GUI 개발에 어떻게 사용될 수 있는지에 대한 느낌을 얻으려면, Fudgets 를 살펴보고 싶을 것입니다. 요즘 90 년대 중반에 설계되었지만 치아에 약간 길어지고 있지만 견고한 FRP 접근법을 제시합니다. GUI 디자인.


답변

Windows Presentation Foundation 은 기능적 접근 방식이 GUI 프로그래밍에 매우 효과적이라는 증거입니다. 많은 기능적 측면이 있으며 “좋은”WPF 코드 (MVVM 패턴 검색)는 명령에 대한 기능적 접근 방식을 강조합니다. WPF가 가장 성공적인 실제 기능 GUI 툴킷이라고 용감하게 주장 할 수 있습니다. 🙂

WPF는 XAML의 사용자 인터페이스를 설명하지만 (기능적으로 보이는 C # 또는 F #으로 다시 작성할 수는 있지만) 사용자 인터페이스를 만들 수 있습니다.

<!-- Declarative user interface in WPF and XAML -->
<Canvas Background="Black">
   <Ellipse x:Name="greenEllipse" Width="75" Height="75"
      Canvas.Left="0" Canvas.Top="0" Fill="LightGreen" />
</Canvas>

또한 WPF를 사용하면 다른 선언적 태그 세트를 사용하여 이벤트에 대한 애니메이션 및 반응을 선언적으로 설명 할 수 있습니다 (다시 말하면 C # / F # 코드로 작성 될 수 있음).

<DoubleAnimation
   Storyboard.TargetName="greenEllipse"
   Storyboard.TargetProperty="(Canvas.Left)"
   From="0.0" To="100.0" Duration="0:0:5" />

실제로 WPF에는 Haskell의 FRP와 공통점이 많은 것으로 생각합니다 (WPF 디자이너는 FRP에 대해 알지 못했고 약간 불행한 것으로 생각하지만 WPF는 때로는 기능을 사용하면 약간 이상하고 불분명합니다. 관점).


답변

실제로 함수형 프로그래밍 (F #)이 C #보다 사용자 인터페이스 프로그래밍에 훨씬 더 좋은 도구라고 말하고 싶습니다. 문제에 대해 조금 다르게 생각하면됩니다.

16 장의 함수형 프로그래밍 책 에서이 주제에 대해 설명 하지만 , F #에서 사용할 수있는 가장 흥미로운 패턴 인 (IMHO)를 보여주는 무료 발췌문이 있습니다 . 사각형 그리기를 구현한다고 가정하십시오 (사용자가 버튼을 누르고 마우스를 움직이고 버튼을 놓습니다). F #에서는 다음과 같이 작성할 수 있습니다.

let rec drawingLoop(clr, from) = async {
   // Wait for the first MouseMove occurrence 
   let! move = Async.AwaitObservable(form.MouseMove)
   if (move.Button &&& MouseButtons.Left) = MouseButtons.Left then
      // Refresh the window & continue looping 
      drawRectangle(clr, from, (move.X, move.Y))
      return! drawingLoop(clr, from)
   else
      // Return the end position of rectangle 
      return (move.X, move.Y) }

let waitingLoop() = async {
   while true do
      // Wait until the user starts drawing next rectangle
      let! down = Async.AwaitObservable(form.MouseDown)
      let downPos = (down.X, down.Y)
      if (down.Button &&& MouseButtons.Left) = MouseButtons.Left then
         // Wait for the end point of the rectangle
         let! upPos = drawingLoop(Color.IndianRed, downPos)
         do printfn "Drawn rectangle (%A, %A)" downPos upPos }

이는 매우 일반적인 접근 방식 (일반적인 실용적인 F # 스타일)이지만 현재 드로잉 상태를 저장하고 초기 위치를 저장하기 위해 변경 가능한 상태를 사용하지 않습니다. 그래도 좀 더 기능적으로 만들 수 있으며, 석사 논문의 일부로 라이브러리를 작성 했으며 다음 며칠 내 내 블로그 에서 사용할 수 있습니다 .

Functional Reactive Programming은보다 기능적인 접근 방법이지만 화살표와 같은 고급 Haskell 기능에 의존하기 때문에 사용하기가 다소 어렵습니다. 그러나 많은 경우에 매우 우아합니다. 제한적인 것은 상태 머신 (반응 형 프로그램에 유용한 멘탈 모델)을 쉽게 인코딩 할 수 없다는 것입니다. 위의 F # 기술을 사용하면 매우 쉽습니다.


답변

F # 또는 OCaml과 같은 하이브리드 기능 / OO 언어 또는 부작용이 IO 모나드로 강등되는 Haskell과 같은 순수 기능 언어에 있더라도 GUI를 관리하는 데 많은 작업이 필요한 경우가 대부분입니다 순전히 기능적인 알고리즘보다 “부작용”과 훨씬 비슷합니다.

기능적인 GUI에 대한 확실한 연구가 있었다 . Fudgets 또는 FranTk 와 같은 기능적 툴킷도 있습니다.


답변

F #에서 Don Syme의 시리즈를 확인하여 데모를 작성하는 GUI를 확인할 수 있습니다. 다음 링크는 시리즈의 세 번째 파트에 대한 것입니다 (여기서 다른 두 파트로 링크 할 수 있음).

WPF 개발에 F #을 사용하는 것은 매우 흥미로운 GUI 패러다임이 될 것입니다 …

http://channel9.msdn.com/shows/Going+Deep/C9-Lectures-Dr-Don-Syme-Introduction-to-F-3-of-3/


답변

Functional Reactive Programming의 기본 개념 중 하나는 이벤트에 대한 반응과 다음 이벤트 처리 기능을 생성하는 이벤트 처리 기능을 갖는 것입니다. 따라서 진화하는 시스템은 일련의 이벤트 처리 기능으로 표현됩니다.

저에게 Yampa에 대한 학습은 그 기능 생성 기능을 올바르게 얻는 중요한 결정이되었습니다. Yampa에 관한 좋은 논문이 있습니다. 나는 Yampa Arcade를 추천합니다 :

http://www.cs.nott.ac.uk/~nhn/Talks/HW2003-YampaArcade.pdf (슬라이드, PDF)
http://www.cs.nott.ac.uk/~nhn/Publications/hw2003. pdf (전체 기사, PDF)

Yampa의 Haskell.org에 위키 페이지가 있습니다

http://www.haskell.org/haskellwiki/Yampa

오리지널 얌파 홈페이지 :

http://www.haskell.org/yampa (불행히도 현재는 망가졌습니다)