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

Haskell · Advanced · question 56 of 100

How do you handle foreign function interface (FFI) in Haskell? Give an example.?

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

Handling the Foreign Function Interface (FFI) in Haskell involves using the ‘foreign‘ keyword and importing C or other languages’ functions, specifying their signatures and marshalling between Haskell data types and the data types of the foreign language.

Here’s an example of using FFI to call the C function ‘strlen‘, which computes the length of a null-terminated string. Suppose you have a C function in a file called ‘strlen.c‘:

#include <string.h>

size_t my_strlen(const char *str) {
    return strlen(str);
}

First, compile the C code to an object file:

gcc -c strlen.c -o strlen.o

Now, let’s create a Haskell program that calls this C function. Create a file ‘strlen.hs‘:

{-# LANGUAGE ForeignFunctionInterface #-}

module Main where

import Foreign.C -- For C types
import Foreign.Ptr -- For Ptr type
import Foreign.Marshal.Array -- For withArray0

-- Foreign import of the C function
foreign import ccall "my_strlen"
    c_strlen :: CString -> IO CSize

-- Wrapper function around the FFI import
strlen :: String -> IO Int
strlen s = withCString s $ cs -> do
    len <- c_strlen cs
    return $ fromIntegral len

main :: IO ()
main = do
    let s = "Hello, Haskell FFI!"
    len <- strlen s
    putStrLn $ "The length of the string "" ++ s ++ "" is " ++ show len ++ "."

Now, we need to compile the Haskell code and link it against the C object file:

ghc --make strlen.hs strlen.o -o strlen

This will produce an executable called ‘strlen‘, which you can run:

./strlen

The output should show:

The length of the string "Hello, Haskell FFI!" is 18.

Here’s an explanation of the Haskell FFI code:

1. Enable the ‘ForeignFunctionInterface‘ language extension at the beginning of the file.

2. Import ‘Foreign.C‘ to work with C types (e.g., ‘CString‘, ‘CSize‘).

3. Import ‘Foreign.Ptr‘ to work with pointers (e.g., ‘Ptr‘).

4. Import ‘Foreign.Marshal.Array‘ to work with C arrays (e.g., ‘withCString‘).

5. Use the ‘foreign import‘ keyword to import the C function ‘my_strlen‘ and specify its type signature. The ‘ccall‘ indicates the C calling convention.

6. Create a Haskell wrapper function ‘strlen‘ that takes a Haskell ‘String‘, marshals it into a ‘CString‘, and calls the C function. The ‘CString‘ is automatically null-terminated. The result is then converted from a ‘CSize‘ to an ‘Int‘.

7. Finally, use the new ‘strlen‘ function in the ‘main‘ function to compute the length of a string.

This is a simple example of how to use the Foreign Function Interface in Haskell to call a C function.

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