<div dir="ltr"><div>The following code (somewhat contrived) code compiles on GHC without issue, and towards the end repeatedly uses the lambda function "(\fn (D x) -> f fn x)". But when I simply try to give it a name, like so:</div><div><br></div><div>h = (\fn (D x) -> f fn x)<br><br>I then get a compile error.<br><br>How can I name this function, or must it remain forever nameless?</div><div><br></div><div>( Ideone link: <a href="http://ideone.com/mtuYnK">http://ideone.com/mtuYnK</a> )</div><div><br></div><div>---</div><div><br></div><div>{-# LANGUAGE TypeFamilies #-}</div><div>{-# LANGUAGE FlexibleInstances #-}</div><div>{-# LANGUAGE FlexibleContexts #-}</div><div>{-# LANGUAGE UndecidableInstances #-}</div><div>{-# LANGUAGE OverlappingInstances #-}</div><div>{-# LANGUAGE ScopedTypeVariables #-}</div><div>{-# LANGUAGE ExistentialQuantification #-}</div><div>{-# LANGUAGE MultiParamTypeClasses #-}</div><div>{-# LANGUAGE ConstraintKinds #-}</div><div>{-# LANGUAGE NoMonomorphismRestriction #-}</div><div><br></div><div>import GHC.Exts (Constraint)</div><div><br></div><div>type family Parent a</div><div><br></div><div>class C a b where</div><div>  f :: b -> a -> String</div><div>  </div><div>instance (C (Parent a) b) => C a b where</div><div>  f _ _ = f (undefined :: b) (undefined :: Parent a) </div><div><br></div><div>data A1 = A1</div><div>data A2 = A2</div><div>data A3 = A3</div><div>data A4 = A4</div><div><br></div><div>type instance Parent A2 = A1</div><div>type instance Parent A3 = A2</div><div>type instance Parent A4 = A3</div><div><br></div><div>data F1 = F1</div><div>data F3 = F3</div><div><br></div><div>instance C A1 F1 where</div><div>  f _ _ = "F1"</div><div><br></div><div>instance C A3 F3 where</div><div>  f _ _ = "F3"</div><div><br></div><div>type family Constraints t a :: Constraint</div><div><br></div><div>data D t = forall a. (Constraints t a) => D a</div><div><br></div><div>type instance Constraints A1 a = (C a F1)</div><div>type instance Constraints A2 a = (C a F1, C a F3)</div><div>type instance Constraints A3 a = (C a F1, C a F3)</div><div>type instance Constraints A4 a = (C a F1, C a F3)</div><div><br></div><div>main = </div><div>  do</div><div>    putStrLn (f F1 A1)</div><div>    putStrLn (f F1 A2)</div><div>    putStrLn (f F1 A3)</div><div>    putStrLn (f F1 A4)</div><div>    putStrLn (f F3 A3)</div><div>    putStrLn (f F3 A4)</div><div>    putStrLn $ (\fn (D x) -> f fn x) F1 ((D A1) :: D A1)</div><div>    putStrLn $ (\fn (D x) -> f fn x) F1 ((D A2) :: D A1)</div><div>    putStrLn $ (\fn (D x) -> f fn x) F3 ((D A3) :: D A2)</div><div><br></div><div>-- h = (\fn (D x) -> f fn x)</div></div>