简而言之,我想在Haskell中进行类型检查:
both f (x, y) = (f x, f y)
foo :: ([Int], [Char])
foo = ([1], "a")
bar :: ([Int], [Char])
bar = both (concat . replicate 3) foo -- intended: ([1, 1, 1], "aaa")
字符串
我得到的错误是:
• Couldn't match type ‘Char’ with ‘Int’
Expected: ([Int], [Int])
Actual: ([Int], [Char])
• In the second argument of ‘both’, namely ‘foo’
In the expression: both (concat . replicate 3) foo
In an equation for ‘bar’: bar = both (concat . replicate 3) foo
型
我在both
中添加了以下类型注解后编译了它:
both :: (forall x. [x] -> [x]) -> ([a], [b]) -> ([a], [b])
both f (x, y) = (f x, f y)
型
但是这个解决方案并不完全令人满意,因为both
看起来更通用,例如both id (1, "a")
也被接受。
1条答案
按热度按时间643ylb081#
我认为这是最合理的版本:
字符串
您的列表示例是
t ~ []
的一个特例,但它也可以与其他容器一起使用,也可以间接地与“未包含”的值一起使用,因为您始终可以使用Identity
-尽管这基本上是无用的,因为唯一的函数∀ x . x -> x
是id
。