The simplest way is to use nginx's Reverse Proxy on a subdirectory. For example (based on this question):
location /snap {
rewrite /snap/(.*) /$1 break;
proxy_pass http://localhost:8000;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
Change localhost:8000
to wherever the Snap application is running.
You can also change the directory name from snap
to anything you want. Just make sure you change it in both places where it appears, and that it doesn't conflict with any of the routes in your RoR application.
However, if you want to use Authentication/Authorization via the Ruby application in order to access the Haskell application's data, you may find it easier to implement your first suggestion of making your own proxy controller because that will allow you to use the Rails app's login logic before you call the Haskell app.