我试图理解在学习Haskell时给我的类型定义。
第一,这一点:
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?
对于2,f (x:xs)是(a -> b)。= f x是[] a,: fmap_List f xs是[] b,对吗?
现在,给定Maybe
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对于3,f Nothing是(a -> b)。= Nothing是-> Maybe a部分。-> Maybe b部件在哪里?
对于4,f (Just a)是(a -> b),= Just (f a)是-> Maybe a。那么,-> Maybe b部件在哪里呢?
我不知道这是怎么回事(希望基于上面的澄清,我能弄清楚):
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)谢谢!
发布于 2019-07-30 22:53:21
如果我们认为一个带多个参数的函数是一个函数,那么
fmap_List :: (a -> b) -> [a] -> [b]这意味着fmap_List是一个双参数函数,其中第一个参数具有a -> b类型,第二个参数具有[a]类型,结果具有[b]类型。
fmap_list f [] = [] --1这里,f是函数的第一个参数的名称,所以f有类型a -> b,[]模式应用于第二个参数([a]类型)。函数的结果是[],它具有与声明的结果类型一致的[b]类型。
fmap_list f (x:xs) = f x : fmap_List f xs --2同样,f有a -> b类型。x:xs是一个与[a]类型的第二个参数匹配的模式。由于:是[a]类型的模式,操作数类型为a和[a],这意味着x将具有a类型,xs将具有[a]类型。f x : fmap_List f xs是[b]类型的表达式。
fmap_Maybe f Nothing = Nothing --3f是a -> b,Nothing与Maybe a匹配,=右边的Nothing是Maybe b类型的结果。
fmap_maybe f (Just a) = Just (f a) --4再说一遍,f就是a -> b。Just a与Maybe a匹配,为a提供了a类型。Just (f a)是Maybe b类型(具有b和Just类型的f a将b转换为Maybe b)的结果。
发布于 2019-07-30 22:53:12
首先,让我用更普通的表示法重写您对fmap_List的定义,其中[] a被写成[a]
fmap_list :: (a -> b) -> [a] -> [b]
fmap_list f [] = []
fmap_list f (x:xs) = f x : fmap_List f xs类型签名告诉您,该函数接受两个参数:一个类型为a -> b的函数和一个类型为[a]的列表,并且它返回一个类型为[b]的列表。因此,这必须意味着,在第二行,例如:
fmap_list f [] = []f有a -> b类型(虽然名称是任意的,但通常使用f和g之类的东西来引用函数,因此这是匹配的),第一个[] (在等号的左边)具有[a]类型。等号右边的[]是函数的结果,[b]类型也是。在后面的行中,情况完全相同。让我试着强调函数定义的类型是如何与带有某种间距的签名的类型匹配的:
fmap_list :: (a -> b) -> [a] -> [b]
fmap_list f [] = []
fmap_list f (x:xs) = f x : fmap_List f xs我希望这现在是有意义的-我认为没有必要在同样的细节中看其他两个例子,因为为此目的,它们是完全相同的。如果您需要进一步的澄清,请在评论中告诉我。
假设中的主要错误是这里(以及类似的情况):"f []是(a -> b)对吗?“不,f是a -> b类型,f []实际上在这里没有意义(这意味着应用于[]的函数f的值,但只有当a是列表类型时才有效,这是没有理由推断的)。函数定义中出现的不是f [],而是fmap_list f [],它被解析为(fmap_list f) []。
https://stackoverflow.com/questions/57280926
复制相似问题