You might not encounter it, as ImplicitParams isn't common, but it has a nice answer. Note that `HasCallStack` is implemented as an implicit parameter: (?callstack :: CallStack).


{-# LANGUAGE TypeOperators, LambdaCase, RankNTypes #-}

import GHC.Stack

type a ?-> b = HasCallStack => a -> b

foo :: a ?-> a
foo x = x

map' :: (a ?-> b) -> [a] ?-> [b]
map' f = \case
  [] -> []
  (x:xs) -> f x : map f xs

ohno :: Int ?-> String
ohno 5 = error "Five is my least favorite number."
ohno x = show x

main = print $ map' ohno [1..10]

This has the result:

*Main> main
["1","2","3","4","*** Exception: Five is my least favorite number.
CallStack (from HasCallStack):
  error, called at /home/matt/impl.hs:16:10 in main:Main
  ohno, called at /home/matt/impl.hs:19:21 in main:Main
  f, called at /home/matt/impl.hs:13:23 in main:Main
  map', called at /home/matt/impl.hs:19:16 in main:Main




Matt Parsons

On Sun, Mar 18, 2018 at 5:05 PM, Thomas Jakway <tjakway@nyu.edu> wrote:

Posting this here since some of you are Scala programmers: https://stackoverflow.com/questions/49353695/type-synonyms-for-implicits

A type-level question you won't encounter in Haskell.

_______________________________________________
Haskell-Cafe mailing list
To (un)subscribe, modify options or view archives go to:
http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe
Only members subscribed via the mailman list are allowed to post.