FLTKHS - Easy Native GUIs in Haskell, Today!

Aditya Siram (@deech)

February 5, 2016

Aditya Siram (@deech)

FLTKHS - Easy Native GUIs in Haskell, Today!

February 5, 2016

1 / 69

Outline

Aditya Siram (@deech)

FLTKHS - Easy Native GUIs in Haskell, Today!

February 5, 2016

2 / 69

What

FLTK (Fast Light Toolkit) C++ No multiple inheritance No exceptions No templates Stable, 20 yrs old Clean install on Win/Linux/Mac Embedded systems Almost no dependencies Not even glibc! Static zero-dependency binaries Fluid Interface Builder

Aditya Siram (@deech)

FLTKHS - Easy Native GUIs in Haskell, Today!

February 5, 2016

3 / 69

What

Native GUI's in pure, impure Haskell All in IO. Near Complete Integration With Fluid Fluid interfaces compile to straight Haskell!

Aditya Siram (@deech)

FLTKHS - Easy Native GUIs in Haskell, Today!

February 5, 2016

4 / 69

Why

Installs easily Yes, Windows too Very few dependencies base, bytestring, directory, lepath,mtl, parsec, c2hs Zero-dependency binaries Yes, Windows too

Aditya Siram (@deech)

FLTKHS - Easy Native GUIs in Haskell, Today!

February 5, 2016

5 / 69

Why

Easy To Learn— Add a 3rd party widget Without recompiling! Type-safe, no unsafeCoerce!

Aditya Siram (@deech)

FLTKHS - Easy Native GUIs in Haskell, Today!

February 5, 2016

6 / 69

Easy

What is "easy"? Re-use existing FLTK documentation Find function & datatypes Straightforward translation of C++ to Haskell Ape the API What is not "easy"? Pure, functional Haskell

Aditya Siram (@deech)

FLTKHS - Easy Native GUIs in Haskell, Today!

February 5, 2016

7 / 69

Easy

Widget names

Fl_Widget is Ref Widget Fl_Light_Button is Ref LightButton

Widget Construction

new Fl_Widget(..) is newWidget ... new Fl_Light_Button(..) is newLightButton ...

Aditya Siram (@deech)

FLTKHS - Easy Native GUIs in Haskell, Today!

February 5, 2016

8 / 69

Easy

Function names are the same as much as possible In FLTK Type Sig

void Fl_Valuator::bounds(double a, double b)

Call

valuatorRef->bounds(1.0, 10.0)

In FLTKHS bounds valuatorRef 1.0 10.0

Aditya Siram (@deech)

FLTKHS - Easy Native GUIs in Haskell, Today!

February 5, 2016

9 / 69

Easy

Getters/Setters prexed with get/set In C++ Type sig

double Fl_Valuator::value() void Fl_Valuator::value(double v)

Call

double v = valuatorRef->value() valuatorRef->value(1.0)

In Haskell v <- getValue valuatorRef setValue valuatorRef 1.0

Aditya Siram (@deech)

FLTKHS - Easy Native GUIs in Haskell, Today!

February 5, 2016

10 / 69

Easy

All FLTKHS methods have multiple dispatch! In C++ int Fl_Input_::value(const char* str, int len) In Haskell setValue :: Ref Input -> String -> Maybe Int -> IO (Int)

Not the real signature! Previously it was: setValue :: Ref Valuator -> Double -> IO () Rest of the arguments depend on the rst!

Aditya Siram (@deech)

FLTKHS - Easy Native GUIs in Haskell, Today!

February 5, 2016

11 / 69

Easy

Error messages are decent too! Missing arguments setValue inputRef Error message Couldn't match type `IO t0' with \ `String -> Maybe Int -> IO Int' In a stmt of a 'do' block: setValue inputRef

Aditya Siram (@deech)

FLTKHS - Easy Native GUIs in Haskell, Today!

February 5, 2016

12 / 69

Easy

Missing everything setValue Less nice, but not horrible Couldn't match expected type `IO t0' with actual type `Ref a0 -> impl0' Probable cause: `setValue' is applied to too \ few arguments

Aditya Siram (@deech)

FLTKHS - Easy Native GUIs in Haskell, Today!

February 5, 2016

13 / 69

Easy

Wrong widget (a table does not have a setValue) setValue tableRef Ugly, the info is there but . . . Couldn't match type \ `NoFunction (SetValue ()) (Graphics.UI.FLTK.LowLevel.Hierarchy.CTable Group)' with `Match r0' GHC 8's custom type errors will help here

Aditya Siram (@deech)

FLTKHS - Easy Native GUIs in Haskell, Today!

February 5, 2016

14 / 69

Easy

Real type sigs. are ugly All widget docs show methods with friendly sigs!

It's all clickable.

Aditya Siram (@deech)

FLTKHS - Easy Native GUIs in Haskell, Today!

February 5, 2016

15 / 69

Easy

And also the widget hierarchy

Parent's functions transparently available!

Aditya Siram (@deech)

FLTKHS - Easy Native GUIs in Haskell, Today!

February 5, 2016

16 / 69

Easy

fltkhs-demos comes with 18 end-to-end demos 16 are exact copies of demos that ship with FLTK Learn by side-by-side comparison

Aditya Siram (@deech)

FLTKHS - Easy Native GUIs in Haskell, Today!

February 5, 2016

17 / 69

Easy

Browser demo (see select menu on bottom left)

Aditya Siram (@deech)

FLTKHS - Easy Native GUIs in Haskell, Today!

February 5, 2016

18 / 69

Easy

C++ and Haskell code that handles select menu callback. Don't worry about details, note the correspondence.

Aditya Siram (@deech)

FLTKHS - Easy Native GUIs in Haskell, Today!

February 5, 2016

19 / 69

Easy

C++ code void btype_cb(Fl_Widget *, void *) { for ( int t=1; t<=browser->size(); t++ ) browser->select(t,0); browser->select(1,0); // leave focus box on first line if ( strcmp(btype->text(),"Normal")==0) browser->type(FL_NORMAL_BROWSER); else if ( strcmp(btype->text(),"Select")==0) browser->type(FL_SELECT_BROWSER); else if ( strcmp(btype->text(),"Hold" )==0) browser->type(FL_HOLD_BROWSER); else if ( strcmp(btype->text(),"Multi" )==0) browser->type(FL_MULTI_BROWSER); browser->redraw(); } Aditya Siram (@deech)

FLTKHS - Easy Native GUIs in Haskell, Today!

February 5, 2016

20 / 69

Easy

Equivalent Haskell code btypeCb :: Ref SelectBrowser -> Ref Choice -> IO () btypeCb browser' btype' = do numLines' <- getSize browser' forM_ [1..(numLines' - 1)] (\l -> select browser' l False) _ <- select browser' 1 False -- leave focus box on first l choice' <- getText btype' case choice' of "Normal" -> setType browser' NormalBrowserType "Select" -> setType browser' SelectBrowserType "Hold" -> setType browser' HoldBrowserType "Multi" -> setType browser' MultiBrowserType _ -> return () redraw browser' Aditya Siram (@deech)

FLTKHS - Easy Native GUIs in Haskell, Today!

February 5, 2016

21 / 69

Easy

C++ for ( int t=1; t<=browser->size(); t++ ) browser->select(t,0); browser->select(1,0); // leave focus box on first line Haskell numLines' <- getSize browser' forM_ [1..(numLines' - 1)] (\l -> select browser' l False) _ <- select browser' 1 False -- leave focus box on first li Comments are preserved!

Aditya Siram (@deech)

FLTKHS - Easy Native GUIs in Haskell, Today!

February 5, 2016

22 / 69

Easy

C++ if ( strcmp(btype->text(),"Normal")==0) browser->type(FL_NORMAL_BROWSER); else if ( strcmp(btype->text(),"Select")==0) browser->type(FL_SELECT_BROWSER); ... Haskell choice' <- getText btype' case choice' of "Normal" -> setType browser' NormalBrowserType "Select" -> setType browser' SelectBrowserType ... _ -> return () Aditya Siram (@deech)

FLTKHS - Easy Native GUIs in Haskell, Today!

February 5, 2016

23 / 69

Easy

Callstacks! Out-of-the-box in 7.10.x All FLTKHS "instance" methods check for a null Ref.

Aditya Siram (@deech)

FLTKHS - Easy Native GUIs in Haskell, Today!

February 5, 2016

24 / 69

Easy

Deletes itself in callback . . . buttonCb b' = do FL.deleteWidget b' l' <- getLabel b' ... main = do ... b' <- buttonNew ... setCallback b' buttonCb ...

Aditya Siram (@deech)

FLTKHS - Easy Native GUIs in Haskell, Today!

February 5, 2016

25 / 69

Easy

Callstack . . . Ref does not exist. \ ?loc, called at /Fl_Types.chs:395:58 in ... toRefPtr, called at /Fl_Types.chs:403:22 in ... withRef, called at /Hierarchy.hs:1652:166 in ... getLabel, called at src/Main.hs:11:10 in main:Main

Aditya Siram (@deech)

FLTKHS - Easy Native GUIs in Haskell, Today!

February 5, 2016

26 / 69

Easy

Project skeleton available: http://github.com/deech/fltkhs-hello-word

Aditya Siram (@deech)

FLTKHS - Easy Native GUIs in Haskell, Today!

February 5, 2016

27 / 69

Fluid

A full edged, mature GUI builder Ships with FLTK Out-of-the-box integration with FLTKHS

Aditya Siram (@deech)

FLTKHS - Easy Native GUIs in Haskell, Today!

February 5, 2016

28 / 69

Fluid

Designed to generate C++ Now generates Haskell! fltkhs-fluidtohs ships with FLTKHS Migrate existing C++ projects easily fltkhs-fluid-examples

Skeleton project available.

https://github.com/deech/fltkhs-fluid-hello-world

Aditya Siram (@deech)

FLTKHS - Easy Native GUIs in Haskell, Today!

February 5, 2016

29 / 69

Fluid

Project structure + fltkhs-fluid-hello-world - ... + src - Callbacks.hs - fluid-hello-world.hs - HelloWorld.fl Installing > cabal install Running > fltkhs-fluid-hello-world

Aditya Siram (@deech)

FLTKHS - Easy Native GUIs in Haskell, Today!

February 5, 2016

30 / 69

Fluid

Unclicked

Aditya Siram (@deech)

FLTKHS - Easy Native GUIs in Haskell, Today!

February 5, 2016

31 / 69

Fluid

Clicking

Aditya Siram (@deech)

FLTKHS - Easy Native GUIs in Haskell, Today!

February 5, 2016

32 / 69

Fluid

Clicked

Aditya Siram (@deech)

FLTKHS - Easy Native GUIs in Haskell, Today!

February 5, 2016

33 / 69

Fluid

> fluid HelloWorld.fl

Aditya Siram (@deech)

FLTKHS - Easy Native GUIs in Haskell, Today!

February 5, 2016

34 / 69

Fluid

Widget Bin

Aditya Siram (@deech)

FLTKHS - Easy Native GUIs in Haskell, Today!

February 5, 2016

35 / 69

Fluid Window properties

Aditya Siram (@deech)

FLTKHS - Easy Native GUIs in Haskell, Today!

February 5, 2016

36 / 69

Fluid

Set the button callback.

Aditya Siram (@deech)

FLTKHS - Easy Native GUIs in Haskell, Today!

February 5, 2016

37 / 69

Fluid

Callback logic module Callbacks where ... buttonCb :: Ref Button -> IO () buttonCb helloWorld = do l' <- getLabel helloWorld if (l' == "Hello World") then setLabel helloWorld "Goodbye World" else setLabel helloWorld "Hello World"

Aditya Siram (@deech)

FLTKHS - Easy Native GUIs in Haskell, Today!

February 5, 2016

38 / 69

Fluid

Imports

Aditya Siram (@deech)

FLTKHS - Easy Native GUIs in Haskell, Today!

February 5, 2016

39 / 69

Fluid

Main Module main = do window <- make_window _ <- showWidget window _ <- FL.run return ()

Aditya Siram (@deech)

FLTKHS - Easy Native GUIs in Haskell, Today!

February 5, 2016

40 / 69

Fluid

The type signature is inside the parens. Window Creating Function

Aditya Siram (@deech)

FLTKHS - Easy Native GUIs in Haskell, Today!

February 5, 2016

41 / 69

Fluid Return Type

Aditya Siram (@deech)

FLTKHS - Easy Native GUIs in Haskell, Today!

February 5, 2016

42 / 69

Fluid

Preprocess Fluid Files in `Setup.hs` main :: IO () main = defaultMainWithHooks (simpleUserHooks { hookedPreProcessors = [("fl", ppFluidToHaskell)]}) ppFluidToHaskell = ...

Aditya Siram (@deech)

FLTKHS - Easy Native GUIs in Haskell, Today!

February 5, 2016

43 / 69

Fluid

The Main UI

Aditya Siram (@deech)

FLTKHS - Easy Native GUIs in Haskell, Today!

February 5, 2016

44 / 69

Fluid

Fluid Intermediate Format ... decl {import Callbacks} {private local} Function {make_window(IO(Ref Window))} {open } { Fl_Window main_window {open xywh {815 469 200 125} type Double hide } { Fl_Button hello_world_button { label {Hello World} callback buttonCb selected xywh {30 30 150 40} } } code {return main_window} {} } Aditya Siram (@deech)

FLTKHS - Easy Native GUIs in Haskell, Today!

February 5, 2016

45 / 69

Fluid

Haskell output module HelloWorld where ... import Callbacks make_window :: IO(Ref Window) make_window = do { main_window
FLTKHS - Easy Native GUIs in Haskell, Today!

February 5, 2016

46 / 69

Fluid Extras

Capable of complicated UI's. fltkhs-fluid-tree in fltkhs-fluid-examples

Aditya Siram (@deech)

FLTKHS - Easy Native GUIs in Haskell, Today!

February 5, 2016

47 / 69

Fluid Extras

Can add functions directly in Fluid!

Aditya Siram (@deech)

FLTKHS - Easy Native GUIs in Haskell, Today!

February 5, 2016

48 / 69

Fluid Extras

The fltkhs-fluid-valuators demo, for example

Aditya Siram (@deech)

FLTKHS - Easy Native GUIs in Haskell, Today!

February 5, 2016

49 / 69

Fluid Extras

Callback function in Fluid

valuator is the function argument

Super hacky, I know. Aditya Siram (@deech)

FLTKHS - Easy Native GUIs in Haskell, Today!

February 5, 2016

50 / 69

Fluid Extras

Callback function body

Aditya Siram (@deech)

FLTKHS - Easy Native GUIs in Haskell, Today!

February 5, 2016

51 / 69

Fluid Extras

Final output module Valuators where ... callback :: (Parent a Valuator) => Ref a -> IO () callback valuator = do { v <- getValue (safeCast valuator :: Ref Valuator); print ((show v) ++ " \\r");; } ... make_window :: IO (Ref Window) make_window = ...

Aditya Siram (@deech)

FLTKHS - Easy Native GUIs in Haskell, Today!

February 5, 2016

52 / 69

The bad . . .

Compile times aren't great compile + link: 11-15 secs, REPL: 9 secs

Aditya Siram (@deech)

FLTKHS - Easy Native GUIs in Haskell, Today!

February 5, 2016

53 / 69

wxHaskell

Very elegant model for multiple dispatch! At the base: data Object a = Object (Ptr a) A child of Object: data CWidget a = CWidget type Widget a = Object (CWidget a) "type Widget a" -> "Object (Ptr (CWidget a))" A child of Widget: data CWindow a = CWindow type Window a = Widget (CWindow a) "type Window a" -> "Object (Ptr (CWidget (CWindow a)))"

Aditya Siram (@deech)

FLTKHS - Easy Native GUIs in Haskell, Today!

February 5, 2016

54 / 69

wxHaskell

A function that takes a "Widget a" print :: Widget a -> IO () print :: Object (Ptr (CWidget a )) -> IO () Also accepts a "Window a"! print :: Object (Ptr (CWidget (CWindow a))) -> IO ()

Aditya Siram (@deech)

FLTKHS - Easy Native GUIs in Haskell, Today!

February 5, 2016

55 / 69

wxHaskell

Extensible without recompiling! data CMyWindow a = CMyWindow type MyWindow a = Window (CMyWindow a) No typeclasses! Haskell 98? Awesome!

Aditya Siram (@deech)

FLTKHS - Easy Native GUIs in Haskell, Today!

February 5, 2016

56 / 69

wxHaskell

Can't handle changing arities. eg. setValue -> inputSetValue / valuatorSetValue I went all in . . . Compile times were great. More and more inconsistent method calls

Aditya Siram (@deech)

FLTKHS - Easy Native GUIs in Haskell, Today!

February 5, 2016

57 / 69

Depression

Couldn't stand my own API. Depression. Walked away for months . . .

Aditya Siram (@deech)

FLTKHS - Easy Native GUIs in Haskell, Today!

February 5, 2016

58 / 69

HList

Turned to HLists data CObject parent; type Object = CObject data CWidget parent; type Widget = CWidget data CWindow parent; type Window = CWindow "type Window" -> "CWindow (CWidget (CObject

Aditya Siram (@deech)

FLTKHS - Easy Native GUIs in Haskell, Today!

() Object Widget ()))"

February 5, 2016

59 / 69

HList

A Hlist for functions too . . . data SetValue a data Print a class Functions object functions instance Functions Widget (SetValue (Print ())) instance Functions Window (SetValue (Print ())) An instance for each implementation . . . class Impl function object impl where run :: function -> (Ref object) -> impl instance Impl (SetValue ()) (Widget ()) \ (String -> IO ()) ... instance Impl (SetValue ()) (Window ()) \ (Int -> Int -> IO ()) Aditya Siram (@deech)

FLTKHS - Easy Native GUIs in Haskell, Today!

February 5, 2016

60 / 69

HList

a function to delegate . . . setValue :: (FindFunction (SetValue ()) a impl) => Ref a -> impl FindFunction also searches down the hierarchy. Essentially what's there now . . . Slightly dierent in the codebase

Aditya Siram (@deech)

FLTKHS - Easy Native GUIs in Haskell, Today!

February 5, 2016

61 / 69

HList

Gives me multiple dispatch Litters the codebase with orphan instances More complicated

Aditya Siram (@deech)

FLTKHS - Easy Native GUIs in Haskell, Today!

February 5, 2016

62 / 69

Transition

Huge transition

Aditya Siram (@deech)

FLTKHS - Easy Native GUIs in Haskell, Today!

February 5, 2016

63 / 69

HList

Up the context-stack But smooth sailing . . .

Aditya Siram (@deech)

FLTKHS - Easy Native GUIs in Haskell, Today!

February 5, 2016

64 / 69

HList

And then few months later . . .

compile + link: 12-15 minutes! Hello Darkness, my old friend . . .

Aditya Siram (@deech)

FLTKHS - Easy Native GUIs in Haskell, Today!

February 5, 2016

65 / 69

HList

cabal build -v3 with a stop watch. Can hez type-level proler? Half the time was spent in the simplifier phase Set some ags ghc-Options: -fno-specialise \ -fmax-simplifier-iterations=0 \ -fsimplifier-phases=0 5 minutes!

Aditya Siram (@deech)

FLTKHS - Easy Native GUIs in Haskell, Today!

February 5, 2016

66 / 69

HList

Upgrade to closed type families No more upping context-stack! 15 secs, 9-10 in REPL! Still not great. OverloadedRecordFields, plz?

Aditya Siram (@deech)

FLTKHS - Easy Native GUIs in Haskell, Today!

February 5, 2016

67 / 69

Why?

Why? No fuss native executables Just throw something together

Re-use intuition from OO toolkits Re-use documentation from FLTK Why not? Denitely retro-looking. Unlikely to change.

Compile times are not good Very likely to change

Aditya Siram (@deech)

FLTKHS - Easy Native GUIs in Haskell, Today!

February 5, 2016

68 / 69

Thanks!

Thanks! Questions?

Aditya Siram (@deech)

FLTKHS - Easy Native GUIs in Haskell, Today!

February 5, 2016

69 / 69

FLTKHS - Easy Native GUIs in Haskell, Today! - GitHub

Feb 5, 2016 - Call. valuatorRef->bounds(1.0, 10.0). In FLTKHS bounds valuatorRef 1.0 10.0. Aditya Siram (@deech). FLTKHS - Easy Native GUIs in Haskell, ...

757KB Sizes 0 Downloads 242 Views

Recommend Documents

haskell-Tensor haskell-OpenGL haskell-GLUT xmobar ... - GitHub
haskell-blaze-html haskell-lcs haskell-ansi-terminal haskell-ansi-wl-pprint hscolour haskell-haskell-src haskell-hostname haskell-StateVar haskell-temporary.

Haskell for LATEX2e - GitHub
School of Computer Science and Engineering. University of New South Wales, Australia [email protected]. .... Research report, Yale University, April 1997. 4.

Categories and Haskell - GitHub
This is often summarized as a side-effect free function. More generally ... The composition g ◦ f is only defined on arrows f and g if the domain of g is equal to the codomain of f. ...... http://files.meetup.com/3866232/foldListProduct.pdf ... Pag

Applying Type-Level and Generic Programming in Haskell - GitHub
Feb 10, 2018 - (Haskell allows to say deriving Eq on a datatype declaration, invoking compiler magic that conjures up a .... Since type-level programming is a bit peculiar in Haskell, we'll move step by step: from normal lists over .... Before we mov

A Haskell Interpreter for Object Calculus - GitHub
Church numerals and encoding are used to represent data and operators in Lambda ... ers have taken to model object-oriented languages, ei- ther adapting or ...

100MB/s Native Task - GitHub
For high IO bandwidth App, there is a lot of memory copies. JNI cross bound copy will cost a lot of time. For example, we use checksum, compression, encryption ...

Handling Exceptions in Haskell
Jan 19, 1999 - ... less idealistic programmers can write in C, Java, Ada and other useful .... since the Prelude is not just ordinary Haskell code, requires a lot of ...

Handling Exceptions in Haskell
Jan 19, 1999 - Handling Exceptions in Haskell. Alastair Reid. Yale University. Department of Computer Science. New Haven, CT 06520 [email protected].

rtGCS Today - GitHub
Jun 8, 2015 - Not iOS (which is ARM). iOS runs on iPhones, OSX on desktops/laptops. As you say, your prospects require stable field operations - I would.

Creating a Native iOS Warehouse Application - GitHub
Dec 13, 2013 - 3. Step 3: Run the New iOS App. Tutorial: Creating a Native iOS Warehouse App ... To call this method, the app sends a message to the shared ..... Use the Xcode editor to add these stubs the same way you added the ...

Notification Center Today Extensions KIM AHLBERG - GitHub
IOS 8 WIDGETS. Notification Center Today Extensions. KIM AHLBERG. We have already had some. Widgets since iOS5. Calendar,. Reminders, Weather... all ...

haskell-book.pdf
Page 2 of 15. PROGRAMACIÓ TRIMESTRAL Escola del Mar, curs 2017-18. 5è. 2. SEGON TRIMESTRE. Numeració i càlcul. - Nombres decimals: part sencera i part decimal. - Dècimes, centèsimes i mil·lèsimes. - Descomposició, comparació i ordenació de

DOWNLOAD in @PDF Programming in Haskell eBook ...
... format for your iPhone iPad Android Computers and Mobile readers Once you have ... solutions, and freely downloadable lecture slides and example code.

haskell-book.pdf
Getting Started . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7. 2.1.1. Simple Arithmetic . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7. 2.1.2. Boolean Algebra . .... haskell-b