我有一个从2个列表重建树的功能.我在所有分支上返回一个列表,但是我收到一个我不理解的错误.但我认为它与返回类型有关.
错误是这样的:
Can't unify ''a with ''a list (Type variable to be unified occurs in type) Found near recon
( ::( preoH, preoT), ::( inoH, ...))
Exception- Fail "Static errors (pass2)" raised
Run Code Online (Sandbox Code Playgroud)
发生错误的行是函数定义的标题 fun recon (preoH::preoT, inoH::inoT) =
这个错误究竟意味着什么,为什么会发生?
(* Reconstruts a binary tree from an inorder and a preorder list. *)
fun recon (preoH::preoT, inoH::inoT) =
(* Case 0: Leaf reached*)
if
preoT = [] andalso inoT = [] andalso preoH = inoH
then
[preoH]
else
let
(* split …Run Code Online (Sandbox Code Playgroud) Haskell中有任何类型的函数a -> b吗?这意味着,是否有可能编写一个这样的函数f :: a -> b?我不认为这样的函数存在以下原因:假设我们发现f在哪里f :: a -> b,会f 2产生什么?类型的值b,但是什么是b因为Haskell不能从我给出的论据推断(我认为)它?它是否正确?否则,你能给我一个这样的功能的例子吗?
这里有很多线程来推导组合函数的推断类型,但我仍然相当困惑.我发现的帖子都没有给出关于如何统一类型的一般性解释.
我的考试学习指南有问题,而且我很难搞清楚.
8)什么是(.)地图的推断类型uncurry :: ________
我能够在大多数时间推导推断类型,但我仍然有点困惑.例如,我知道要获得(.)map uncurry的答案,您需要首先派生地图类型uncurry.我能做到这一点
鉴于以下类型
map :: (a -> b) -> [a] -> [b]
uncurry :: (a -> b -> c) -> (a, b) -> c
Run Code Online (Sandbox Code Playgroud)
我将地图中的函数(a - > b)与uncurry统一起来
a = a ? b ? c
b = (a, b) ? c
Run Code Online (Sandbox Code Playgroud)
然后答案是地图[a] - > [b]的另一半,其中a和b的新值如此
map uncurry :: [ a -> b -> c ] -> [ (a, b) -> c]
Run Code Online (Sandbox Code Playgroud)
然后你需要统一
(.) :: (b -> c) -> (a -> b) -> a -> c …Run Code Online (Sandbox Code Playgroud) foldr :: (a->b->b)->b->[a]->b
(!!)::[c]->Int->c
Run Code Online (Sandbox Code Playgroud)
从那我们得到a->b->b=[c]->Int->c
或a=[c],b=Int,b=c.
我们得出结论,foldr(!!)的类型是Int->[[Int]]->Int.
这是对的吗?
WinGHCi告诉我一些不同的东西:
Prelude> :t foldr (!!)
foldr (!!) :: Foldable t => Int -> t [Int] -> Int
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 . …
我必须从Haskell中的给定函数中找到最通用的类型,或者更确切地说找到两个函数的"产品"的最一般类型(如果存在).我不确定但也许我应该使用Robinson统一算法,但我无法理解它.我需要一步一步的详细解决方案,所以我能理解.
功能 :
map :: (a ? b) ? [a] ? [b]
iterate :: (a ? a) ? a ? [a]
Run Code Online (Sandbox Code Playgroud)
如何找到最常用的类型
map iterate iterate map这不是作业.