首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >理解类型定义

理解类型定义
EN

Stack Overflow用户
提问于 2019-07-30 22:40:38
回答 2查看 110关注 0票数 2

我试图理解在学习Haskell时给我的类型定义。

第一,这一点:

代码语言:javascript
复制
fmap_List :: (a -> b) -> [] a -> [] b
fmap_list f [] = [] --1
fmap_list f (x:xs) = f x : fmap_List f xs --2

1来说,f [](a -> b)对吗?然后= [][] a。什么是[] b

对于2f (x:xs)(a -> b)= f x[] a: fmap_List f xs[] b,对吗?

现在,给定Maybe

代码语言:javascript
复制
data Maybe a = Nothing | Just a

fmap_Maybe :: (a -> b) -> Maybe a -> Maybe b
fmap_Maybe f Nothing = Nothing --3
fmap_maybe f (Just a) = Just (f a) --4

对于3f Nothing(a -> b)= Nothing-> Maybe a部分。-> Maybe b部件在哪里?

对于4f (Just a)(a -> b)= Just (f a)-> Maybe a。那么,-> Maybe b部件在哪里呢?

我不知道这是怎么回事(希望基于上面的澄清,我能弄清楚):

代码语言:javascript
复制
fmap_Either :: (a -> b) -> (Either e) a -> (Either e) b
fmap_Either f (Left e) = Left e
fmap_Either f (Right a) = Right (f a)

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-07-30 22:53:21

如果我们认为一个带多个参数的函数是一个函数,那么

代码语言:javascript
复制
fmap_List :: (a -> b) -> [a] -> [b]

这意味着fmap_List是一个双参数函数,其中第一个参数具有a -> b类型,第二个参数具有[a]类型,结果具有[b]类型。

代码语言:javascript
复制
fmap_list f [] = [] --1

这里,f是函数的第一个参数的名称,所以f有类型a -> b[]模式应用于第二个参数([a]类型)。函数的结果是[],它具有与声明的结果类型一致的[b]类型。

代码语言:javascript
复制
fmap_list f (x:xs) = f x : fmap_List f xs --2

同样,fa -> b类型。x:xs是一个与[a]类型的第二个参数匹配的模式。由于:[a]类型的模式,操作数类型为a[a],这意味着x将具有a类型,xs将具有[a]类型。f x : fmap_List f xs[b]类型的表达式。

代码语言:javascript
复制
fmap_Maybe f Nothing = Nothing --3

fa -> bNothingMaybe a匹配,=右边的NothingMaybe b类型的结果。

代码语言:javascript
复制
fmap_maybe f (Just a) = Just (f a) --4

再说一遍,f就是a -> bJust aMaybe a匹配,为a提供了a类型。Just (f a)Maybe b类型(具有bJust类型的f ab转换为Maybe b)的结果。

票数 7
EN

Stack Overflow用户

发布于 2019-07-30 22:53:12

首先,让我用更普通的表示法重写您对fmap_List的定义,其中[] a被写成[a]

代码语言:javascript
复制
fmap_list :: (a -> b) -> [a] -> [b]
fmap_list f [] = []
fmap_list f (x:xs) = f x : fmap_List f xs

类型签名告诉您,该函数接受两个参数:一个类型为a -> b的函数和一个类型为[a]的列表,并且它返回一个类型为[b]的列表。因此,这必须意味着,在第二行,例如:

代码语言:javascript
复制
fmap_list f [] = []

fa -> b类型(虽然名称是任意的,但通常使用fg之类的东西来引用函数,因此这是匹配的),第一个[] (在等号的左边)具有[a]类型。等号右边的[]是函数的结果,[b]类型也是。在后面的行中,情况完全相同。让我试着强调函数定义的类型是如何与带有某种间距的签名的类型匹配的:

代码语言:javascript
复制
fmap_list :: (a -> b) -> [a]    -> [b]
fmap_list    f           []     =  []
fmap_list    f           (x:xs) =  f x : fmap_List f xs

我希望这现在是有意义的-我认为没有必要在同样的细节中看其他两个例子,因为为此目的,它们是完全相同的。如果您需要进一步的澄清,请在评论中告诉我。

假设中的主要错误是这里(以及类似的情况):"f [](a -> b)对吗?“不,fa -> b类型,f []实际上在这里没有意义(这意味着应用于[]的函数f的值,但只有当a是列表类型时才有效,这是没有理由推断的)。函数定义中出现的不是f [],而是fmap_list f [],它被解析为(fmap_list f) []

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57280926

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档