我明白那个:
(==):: Eq a => a - > a - > Bool
应用程序的示例可以是(==)2 2,结果为True.
然后:
uncurry(==):: Eq b =>(b,b) - > Bool.
应用程序的示例可能是uncurry(==)(2,2),结果为True.
但我不明白并想象一个例子为什么:
咖喱(==)::(Eq a,Eq b)=> a - > b - >(a,b) - > Bool
有帮助吗?
谢谢,
塞巴斯蒂安
可以查询ghci的统一类型吗?
例如,如果我想知道之间的统一类型(Int -> Bool)以及(a -> Bool)如何查询到ghci?
我想要解决的是Haskell第三版的练习13.23 :功能编程工艺.
你如何使用Haskell系统来检查两个类型表达式是否是统一的,如果是这样,它们的统一是什么?提示:您可以在Haskell中进行虚拟定义,其中定义的值(锆石)与其自身等同:
Run Code Online (Sandbox Code Playgroud)zircon = zircon像这样定义的值可以声明为您想要的任何类型.
谢谢,
塞巴斯蒂安.
我试图理解为什么类型fun g x = ys where ys = [x] ++ filter (curry g x) ys的((a, a) -> Bool) -> a -> [a].
我明白那个:
filter :: (a -> Bool) -> [a] -> [a] 然后 curry :: ((a, b) -> c) -> a -> b -> c
但我不明白如何继续.
我试图推导出类型 (.) (foldr(++)) (map (:))
我首先推导出类型 foldr (++)
foldr :: (a1 -> b1 -> b1) -> b1 -> [a1] -> b1
(++) :: [a2] -> [a2] -> [a2]
a1 ~ [a2]
b1 ~ [a2]
b1 ~ [a2]
Run Code Online (Sandbox Code Playgroud)
所以
foldr (++) :: [a2] -> [[a2]] -> [a2] ~ [a] -> [[a]] -> [a]
Run Code Online (Sandbox Code Playgroud)
然后我推导出类型 map (:)
map :: (a1 -> b1) -> [a1] -> [b1]
(:) :: a2 -> [a2] -> [a2]
a1 ~ a2
b1 ~ [a2] -> [a2]
Run Code Online (Sandbox Code Playgroud)
所以 …
我试图理解为什么类型:
(flip .) is: (a -> a1 -> b -> c) -> a -> b -> a1 -> c
首先,类型:
flip: is (a -> b -> c) -> b -> a -> c
(.): is (b -> c) -> (a -> b) -> a -> c
我将在我的解释中将变量重命名为更清晰,因此类型:
flip: is (ax -> bx -> cx) -> bx -> ax -> cx
(.): is (by -> cy) -> (ay -> by) -> ay -> cy
然后我尝试这样替换:
ax = (by -> cy)
bx …
我想手动派生类型:
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) 我正在尝试手动派生类型(foldr(.))
foldr :: (a1 -> b1 -> b1) -> b1 -> [a1] -> b1
(.) ::(b2 -> c2) -> (a2 -> b2) -> a2 -> c2
Run Code Online (Sandbox Code Playgroud)
然后:
a1 ~ (b2 -> c2)
b1 ~ (a2 -> b2)
b1 ~ a2
Run Code Online (Sandbox Code Playgroud)
所以我明白了 (foldr (.)) :: (a2 -> b2) -> [(b2 -> c2)] -> (a2 -> b2)
但GHCi回归: :t (foldr (.)) :: (a -> b) -> [b -> b] -> a -> b
为什么b2和c2是一样的?
谢谢,
塞巴斯蒂安.
我试图理解为什么这两个评价:(init . cuts) [1,2,3]并且init . cuts [1,2,3]是不同的,其中:
cuts :: [a] -> [([a],[a])]
cuts xs = zipWith splitAt [0..length xs] (repeat xs)
Run Code Online (Sandbox Code Playgroud)
第一个给出了我预期的结果:[([],[1,2,3]),([1],[2,3]),([1,2],[3])],但是第二个返回此错误:
<interactive>:389:8:
Couldn't match expected type `a0 -> [a1]'
with actual type `[([a2], [a2])]'
In the return type of a call of `cuts'
Probable cause: `cuts' is applied to too many arguments
In the second argument of `(.)', namely `cuts [1, 2, 3]'
In the expression: init . cuts [1, 2, 3]
Run Code Online (Sandbox Code Playgroud)
我认为,这init . …