clr-inline
NOTE: you will need GHC >= 8.2 to use this package in Windows.
What is clr-inline
clr-inline provides a quasiquoter to inline F# and C# code in Haskell modules.
It was inspired by [inline-java
], [inline-c
] and [inline-r
], and it is implemented
on top of clr-host and clr-marshal packages.
Example
Graphical hello world using F# Winforms:
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE QuasiQuotes #-}
{-# LANGUAGE TemplateHaskell #-}
module Main where
import Clr.Inline
[fsharp|
open System.Windows.Forms
|]
main = do
startClr
let text = "Hello from Haskell"
[fsharp|
let form = new Form(Text=$text:string)
let button = new Button(Text="Click Me!", Dock=DockStyle.Fill)
button.Click.Add(fun _ -> MessageBox.Show($text, "Hey!") |> ignore)
form.Controls.Add(button)
Application.Run(form)
|]
Features
- Inline F# / C# in Haskell.
- Automatic unmarshalling of CLR primitive types into Haskell.
- Reference types support including arrays and generics.
- Refer to (
Quotable
) Haskell values inside F# / C# quotations.
- Experimental support for Haskell lambdas in F#.
- See the InlineSpec.hs test module for examples of usage.
- Only mscorlib types are admitted, type resolution will crash at runtime otherwise.
Getting Started
Install the clr-inline
package from Hackage using your preferred package manager:
$ cabal install clr-inline
$ stack install clr-inline
By default, .Net
is used in Windows and mono
in other systems.
This is driven by Cabal flags in the clr-host
package.
Requirements
clr-inline
requires GHC >=8.0 for mono
, and either GHC >=8.2 or a linker preprocessor for .Net
.
Cabal requires that the CLR compiler is in the application path at cabal configure
time.
The module Clr.Inline.Cabal
provides an optional Cabal user hook that can be added to a cabal
Setup script to check for this automatically
Bug #14090 in GHC 8.2.1 requires that the StaticPointers language extension is turned on in every module that
contains an inline F# or C# block. Moreover, the modules must have an unrestricted export list.
The quasiquoters look for the F#/C# compiler binaries in the
application path. External dependencies and additional search paths can be provided to
the quasiquoter as configuration. Configuration creates a new quasiquoter;
since GHC does not allow calling a quasiquoter from the same module where it is
defined, the recommended practice is to configure the quasiquoters in a
dedicated Config module. Example configuration for WPF dependencies:
module WpfDeps where
import Clr.Inline
import Clr.Inline.Config
wpf =
fsharp' $
defaultConfig
{ configDependencies =
[ "System.Xaml"
, "WindowsBase"
, "PresentationCore"
, "PresentationFramework"
]
}
LICENSE
Copyright (c) 2017 Jose Iborra
clr-inline is free software and may be redistributed under the terms
specified in the LICENSE file.