diff --git a/README.md b/README.md
index be36c1a..4ad5a52 100644
--- a/README.md
+++ b/README.md
@@ -304,6 +304,33 @@ func main() {
+### ruapu with Haskell
+
+
+
+
+Add ruapu library to your project
+
+`haskell/Ruapu.hs`, `haskell/ruapu.c` and `ruapu.h` should be copied in your
+project.
+
+ |
+
+
+Use ruapu in Haskell
+
+```haskell
+import Ruapu
+-- Ruapu.rua :: IO [String]
+-- Ruapu.supports :: String -> IO Bool
+main = do
+ Ruapu.init
+ Ruapu.supports "mmx" >>= putStrLn . show
+ Ruapu.rua >>= foldl (\m x -> m >> putStrLn x) (return ())
+```
+ |
+
+
Github-hosted runner result (Linux)
diff --git a/haskell/Ruapu.hs b/haskell/Ruapu.hs
new file mode 100644
index 0000000..075c4fc
--- /dev/null
+++ b/haskell/Ruapu.hs
@@ -0,0 +1,21 @@
+{-# Language ForeignFunctionInterface #-}
+
+module Ruapu where
+
+import Foreign
+import Foreign.C.String (CString, newCAString, peekCAString)
+
+foreign import ccall "ruapu.c ruapu_init"
+ init :: IO ()
+
+foreign import ccall "ruapu.c ruapu_supports"
+ cSupports :: CString -> IO Bool
+
+foreign import ccall "ruapu.c ruapu_rua"
+ cRua :: IO (Ptr CString)
+
+supports :: String -> IO Bool
+supports xs = (newCAString xs) >>= cSupports
+
+rua :: IO [String]
+rua = cRua >>= peekArray0 nullPtr >>= mapM peekCAString
diff --git a/haskell/ruapu.c b/haskell/ruapu.c
new file mode 100644
index 0000000..a4a466f
--- /dev/null
+++ b/haskell/ruapu.c
@@ -0,0 +1,2 @@
+#define RUAPU_IMPLEMENTATION
+#include"ruapu.h"