标签: unification

要统一的类型变量出现在类型中

我有一个从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)

types compiler-errors sml unification

2
推荐指数
1
解决办法
124
查看次数

在Haskell中使用类型a - > b的函数?

Haskell中有任何类型的函数a -> b吗?这意味着,是否有可能编写一个这样的函数f :: a -> b?我不认为这样的函数存在以下原因:假设我们发现f在哪里f :: a -> b,会f 2产生什么?类型的值b,但是什么是b因为Haskell不能从我给出的论据推断(我认为)它?它是否正确?否则,你能给我一个这样的功能的例子吗?

haskell types type-inference unification

2
推荐指数
1
解决办法
911
查看次数

派生推断类型的组合函数Haskell:具体(.)map uncurry

这里有很多线程来推导组合函数的推断类型,但我仍然相当困惑.我发现的帖子都没有给出关于如何统一类型的一般性解释.

我的考试学习指南有问题,而且我很难搞清楚.

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)

haskell types unification ghci inferred-type

1
推荐指数
1
解决办法
280
查看次数

派生类型的折叠(!!)

foldr :: (a->b->b)->b->[a]->b
(!!)::[c]->Int->c
Run Code Online (Sandbox Code Playgroud)

从那我们得到a->b->b=[c]->Int->ca=[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)

haskell types unification ghci

1
推荐指数
1
解决办法
78
查看次数

哪种(翻转.)?

我试图理解为什么类型:

(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 …

haskell types unification ghci

0
推荐指数
1
解决办法
141
查看次数

手动推导`f1 x xs =(filter.(<))x xs`的类型

我想手动派生类型:

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)

haskell types unification ghci

0
推荐指数
1
解决办法
131
查看次数

派生类型(foldr(.))

我正在尝试手动派生类型(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是一样的?

谢谢,
塞巴斯蒂安.

haskell types unification ghci

0
推荐指数
1
解决办法
102
查看次数

为什么评估`init的结果.cut [1,2,3]`与`(init.cutters)[1,2,3]不同?

我试图理解为什么这两个评价:(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 types unification

0
推荐指数
1
解决办法
80
查看次数

Haskell中两个函数的最常见类型的"产品"

我必须从Haskell中的给定函数中找到最通用的类​​型,或者更确切地说找到两个函数的"产品"的最一般类型(如果存在).我不确定但也许我应该使用Robinson统一算法,但我无法理解它.我需要一步一步的详细解决方案,所以我能理解.

功能 :

map :: (a ? b) ? [a] ? [b] 
iterate :: (a ? a) ? a ? [a]
Run Code Online (Sandbox Code Playgroud)

如何找到最常用的类型

  1. map iterate
  2. iterate map

这不是作业.

haskell types type-inference unification

0
推荐指数
1
解决办法
535
查看次数