这是个人练习,可以更好地理解Haskell类型系统的局限性.我想创建一个最通用的函数,它可以将一些函数应用于2个入口元组中的每个条目,例如:
applyToTuple fn (a,b) = (fn a, fn b)
Run Code Online (Sandbox Code Playgroud)
我试图使这个功能在以下每种情况下都有效:
(1) applyToTuple length ([1,2,3] "hello")
(2) applyToTuple show ((2 :: Double), 'c')
(3) applyToTuple (+5) (10 :: Int, 2.3 :: Float)
Run Code Online (Sandbox Code Playgroud)
因此对于length对中的项目必须是Foldable,为了显示它们必须是Show等的实例.
使用RankNTypes我可以去一些方式,例如:
{-# LANGUAGE RankNTypes #-}
applyToTupleFixed :: (forall t1. f t1 -> c) -> (f a, f b) -> (c, c)
applyToTupleFixed fn (a,b) = (fn a, fn b)
Run Code Online (Sandbox Code Playgroud)
这允许可以在一般上下文中工作的函数f应用于该上下文中的项.(1)使用它,但元组项目,(2)并(3)没有上下文,所以它们不起作用(无论如何,3将返回不同的类型).我当然可以定义一个上下文来放置项目,例如:
data Sh …Run Code Online (Sandbox Code Playgroud)