WalzoneInterview Prep
📞 Interviewing soon? Practice with a realistic AI mock phone interview — it calls you, then scores you. First 15 min FREE →

Haskell · Expert · question 76 of 100

How would you handle interoperation between Haskell and other languages?

📕 Buy this interview preparation book: 100 Haskell questions & answers — PDF + EPUB for $5

Interoperation between Haskell and other languages can be achieved through a combination of techniques, including the Foreign Function Interface (FFI) and various libraries that facilitate high-level multilanguage interoperation. The choice of technique depends on factors like the language you want to integrate with Haskell and the complexity of the interaction.

1. **Foreign Function Interface (FFI)**: FFI is the most common method for integrating Haskell and other languages seamlessly. It allows you to call functions written in other languages (such as C, C++, or even other programming languages) from Haskell, as well as export Haskell functions to be called from those languages.

To use FFI, you need to declare the foreign function in Haskell with a ‘foreign import‘ or ‘foreign export‘ statement. You also need to link the Haskell code with the compiled code from the other language (usually a C library).

Here’s a simple example of using FFI to import and call a C function from Haskell:

C code (‘addition.c‘):

int add_int(int a, int b) {
  return a + b;
}

Haskell code (‘Main.hs‘):

{-# LANGUAGE ForeignFunctionInterface #-}

import Foreign.C.Types

foreign import ccall "add_int" addInt :: CInt -> CInt -> CInt

main :: IO ()
main = do
  let a = 5 :: CInt
  let b = 7 :: CInt
  let result = addInt a b
  putStrLn $ "The result is: " ++ show result

To compile and run the example:

$ gcc -c -o addition.o addition.c
$ ghc -o main Main.hs addition.o
$ ./main
The result is: 12

2. **High-Level Language-Binding Libraries**: There are several Haskell binding libraries available for common languages, such as Python, JavaScript, and R. These libraries provide functions and types that allow you to call functions or manipulate data from the target language directly in Haskell. These high-level bindings usually involve automatic memory management and type marshaling.

For instance, to interact with Python, you can use the ‘inline-c‘ package for C interop, together with the ‘ctypes‘ package for Python C API interop.

Here’s an example of using the ‘ctypes‘ package to call a Python function from Haskell:

Install the dependencies:

$ cabal install numpy ctypes

Haskell code:

{-# LANGUAGE QuasiQuotes #-}

import CPython.Simple

main :: IO ()
main = do
  run $ do
    let code = [py|
import numpy as np
def add_np_array(x, y):
    return np.add(x, y)
|]
    importM code >>= loadObject

    addNpArray <- (*>) getContext "add_np_array"

    result <- toDoubleList =<< call addNpArray [intListArg [1, 2], intListArg [3, 4]]
    liftIO $ putStrLn $ "The result is: " ++ show result

This code imports the ‘numpy‘ package in Python, defines a Python function ‘add_np_array‘ that adds two NumPy arrays, and then calls that function from Haskell.

In summary, depending on the target language and your specific use case, you may choose between the low-level FFI approach and high-level language-binding libraries to interoperate between Haskell and other languages. The complexity of the interaction, performance requirements, and available libraries and tools will influence your choice.

Reading is step one. Saying it out loud is the interview. Our AI interviewer calls your phone and runs a realistic Haskell interview — then scores it.
📞 Practice Haskell — free 15 min
📕 Buy this interview preparation book: 100 Haskell questions & answers — PDF + EPUB for $5

All 100 Haskell questions · All topics