aboutsummaryrefslogtreecommitdiff
path: root/ch07_07.1-iii.hs
diff options
context:
space:
mode:
authorPaul Oliver <contact@pauloliver.dev>2025-01-03 11:01:20 -0800
committerPaul Oliver <contact@pauloliver.dev>2025-01-05 09:59:10 -0800
commit6a0d7f5c434c3564d0119befb6799fd77581050a (patch)
treef20bc998290211d2a895523417ad32e297b31af0 /ch07_07.1-iii.hs
InitialHEADmaster
Diffstat (limited to 'ch07_07.1-iii.hs')
-rw-r--r--ch07_07.1-iii.hs11
1 files changed, 11 insertions, 0 deletions
diff --git a/ch07_07.1-iii.hs b/ch07_07.1-iii.hs
new file mode 100644
index 0000000..1285fd9
--- /dev/null
+++ b/ch07_07.1-iii.hs
@@ -0,0 +1,11 @@
+-- Exercise 7.1-iii
+-- Write the `Show` instance for `HasShow` in terms of `elimHasShow`.
+data HasShow where
+ HasShow :: Show t => t -> HasShow
+
+elimHasShow :: (forall a. Show a => a -> r) -> HasShow -> r
+elimHasShow f (HasShow a) = f a
+
+-- This version also prepends the `HasShow` name to the result of `show`:
+instance Show HasShow where
+ show = mappend "HasShow " . elimHasShow show