如果我有这些定义
twice f = f . f
swap (x,y) = (y,x)
Run Code Online (Sandbox Code Playgroud)
times 的类型被推断为(a -> a) -> a -> a
,swap 被推断为(a,b) -> (b,a)
。
如果我写swap . swap
该表达式的类型是(a, b) -> (a, b)
.
但如果我要求twice swap
它的类型是(a, a) -> (a, a)
.
我知道这twice
是限制 的类型swap
。但我想知道是否有一种方法twice
可以使其接受swap
而不限制其类型。也就是说,您可以编写twice swap
和接受每个组件具有不同类型的对。
同样的情况也发生在flip :: (a -> b -> c) -> b -> a -> c
, 因为twice flip :: (a …
我正在使用类型的函数实现一个 Seta -> Bool
到目前为止,这是我的代码:
data Set a = S (a -> Bool)
empty :: Set a
empty = S (const False)
singleton :: Eq a => a -> Set a
singleton e = S (e ==)
belongs :: Set a -> a -> Bool
belongs (S s) = s
-- private
_combine :: (Bool -> Bool -> Bool) -> (a -> Bool) -> (a -> Bool) -> (a -> Bool)
_combine op f g = \x -> f …
Run Code Online (Sandbox Code Playgroud)