Fof*_*Fof 0 haskell types unification ghci
我想手动派生类型:
f1 x xs = (filter . (<)) x xs
我们第一次看到x,所以:
x :: t1
Run Code Online (Sandbox Code Playgroud)
然后(<)有这种类型:
(<) :: Ord a1 => a1 -> a1 -> Bool
Run Code Online (Sandbox Code Playgroud)
我们只能说(< x)是否可以统一以下类型:
t1 ~ a1
Run Code Online (Sandbox Code Playgroud)
然后
x :: a1
Run Code Online (Sandbox Code Playgroud)
所以
(<x) :: Ord a1 => a1 -> Bool
Run Code Online (Sandbox Code Playgroud)
过滤器有这种类型
filter :: (a2 -> Bool) -> [a2] -> [a2]
Run Code Online (Sandbox Code Playgroud)
第一次看到xs,所以:
xs :: t2
Run Code Online (Sandbox Code Playgroud)
我们只能说(filter . (<)) x xs是否可以统一以下类型:
a1 -> Bool ~ a2 -> Bool
t2 ~ [a2]
Run Code Online (Sandbox Code Playgroud)
所以我得到的,与正确类型f1 :: (a2 -> Bool) -> [a2] -> [a2]相同的类型(询问GHCi).filterOrd a => a -> [a] -> [a]
有帮助吗?
约束
a1 -> Bool ~ a2 -> Bool
Run Code Online (Sandbox Code Playgroud)
可以细分为
a1 ~ a2
Run Code Online (Sandbox Code Playgroud)
而且显然是真的
Bool ~ Bool
Run Code Online (Sandbox Code Playgroud)
所以你有a1 ~ a2.你已经知道那x是a1,xs是,[a2]并且,由于filter结果类型是[a2].因此,您最终得到:
f1 :: Ord a2 => a2 -> [a2] -> [a2]
Run Code Online (Sandbox Code Playgroud)
(不要忘记阶级约束a1从获得(<).)