小编Fof*_*Fof的帖子

咖喱(==)如何运作?

我明白那个:

(==):: 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

有帮助吗?

谢谢,
塞巴斯蒂安

haskell types currying ghci

6
推荐指数
2
解决办法
238
查看次数

如何查询统一类型为ghci?

可以查询ghci的统一类型吗?

例如,如果我想知道之间的统一类型(Int -> Bool)以及(a -> Bool)如何查询到ghci?

我想要解决的是Haskell第三版的练习13.23 :功能编程工艺.

你如何使用Haskell系统来检查两个类型表达式是否是统一的,如果是这样,它们的统一是什么?提示:您可以在Haskell中进行虚拟定义,其中定义的值(锆石)与其自身等同:

zircon = zircon
Run Code Online (Sandbox Code Playgroud)

像这样定义的值可以声明为您想要的任何类型.

谢谢,
塞巴斯蒂安.

haskell types unification ghci

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

乐趣类型gx = ys,其中ys = [x] ++ filter(curry gx)ys?

我试图理解为什么类型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

但我不明白如何继续.

haskell types unification

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

手动派生类型`(.)(foldr(++))(map(:))`

我试图推导出类型 (.) (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)

所以 …

haskell types unification ghci

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

哪种(翻转.)?

我试图理解为什么类型:

(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 ×8

types ×8

unification ×7

ghci ×6

currying ×1