-- See the README file for an example session. module Main where import Foreign.MathLink addFour :: (Int,Int,Int,Int) -> IO Int addFour (a,b,c,d) = return $ a+b+c+d -- Note that functions to be exposed need to be uncurried. ackermann :: (Integer,Integer) -> IO Integer ackermann (m,n) = return $ ack m n ack :: Integer -> Integer -> Integer ack 0 n = n + 1 ack 1 n = n + 2 ack 2 n = 2 * n + 3 ack m 0 = ack (m-1) 1 ack m n = ack (m-1) (ack m (n-1)) decl :: MLSpec decl = [ Eval $ "BeginPackage":@[St "Test`"] , DeclMsg "AddFour" "usage" "AddFour[a,b,c,d] returns the sum of a, b, c, and d." , DeclMsg "Ackermann" "usage" "Ackermann[m,n]: the Ackermann function." , Eval $ "Begin":@[St "`Private`"] , DeclFn { callPattern = "AddFour[a_Integer,b_Integer,c_Integer,d_Integer]" , argPattern = "{a,b,c,d}" , func = addFour } , DeclFn { callPattern = "Ackermann[i_Integer,j_Integer]" , argPattern = "{i,j}" , func = ackermann } , Eval $ "End":@[] , Eval $ "EndPackage":@[] ] main :: IO () main = runMathLink decl