Haskell 传递两个不同类型的参数
我想创建一个函数,我们称之为altHead,它接受2个变量并输出一个变量,如下所示:Haskell 传递两个不同类型的参数,haskell,Haskell,我想创建一个函数,我们称之为altHead,它接受2个变量并输出一个变量,如下所示: a -> [a] -> a 我想这样称呼它: altHead 3 [1,2,3,4] 它应该做的是查看第一个变量和列表。如果列表为空,则返回第一个var的值;否则,返回列表 在本例中,我编写了以下代码 altHead :: a -> [a] -> a altHead (x:xs) = if null[xs] then [x] else [xs] 然而,我相信x:xs只会查看列表 我
a -> [a] -> a
我想这样称呼它:
altHead 3 [1,2,3,4]
它应该做的是查看第一个变量和列表。如果列表为空,则返回第一个var的值;否则,返回列表
在本例中,我编写了以下代码
altHead :: a -> [a] -> a
altHead (x:xs) = if null[xs] then [x] else [xs]
然而,我相信x:xs只会查看列表
我有点纠结于如何更改它,以便它也能看到第一个值,以及如何在函数中包含第一个值。您想要类似于:
altHead :: a -> [a] -> a
altHead a xs = if null xs then a else head xs
或者,使用列表上的模式匹配:
altHead :: a -> [a] -> a
altHead a [] = a
altHead a (x:xs) = x
你想要的是:
altHead :: a -> [a] -> a
altHead a xs = if null xs then a else head xs
或者,使用列表上的模式匹配:
altHead :: a -> [a] -> a
altHead a [] = a
altHead a (x:xs) = x
提示:根本不要使用if/then/else。模式匹配就是你所需要的一切。@Carl-Hmmm所以,altHead[]=x////altHead[a]=a]?
(x:xs)
不绑定两个参数,它绑定一个必须是列表的参数的首尾。@Wyzard-yes,这也是我得出的结论。只是不知道如何在其中包含第一个var…altheada(x:xs)=
提示:根本不要使用if/then/else。模式匹配就是你所需要的一切。@Carl-Hmmm所以,altHead[]=x////altHead[a]=a]?(x:xs)
不绑定两个参数,它绑定一个必须是列表的参数的首尾。@Wyzard-yes,这也是我得出的结论。只是不知道如何将第一个变量也包含在其中…altHead a(x:xs)=
第二个示例的最后一行也可以写altHead(x:u)=x
,因为实际上既没有使用a
也没有使用xs
。是的,我只是认为将它们作为变量名保留有助于可读性/理解。(它还显示了OP使用的(x:xs)
模式。)我想我现在明白了一些我以前从根本上误解的东西。谢谢你,当我完成我的版本时,我看到了它,它有点不对劲,但在其他方面还行。Quick Q:我意识到这不是正常的键入方式,但是如果列表不是空的,它是否可以返回整个列表,否则只返回x?你不能有一个函数,有时返回列表,有时返回单个值,因为它们是不同的类型。但是您可以将签名更改为a->[a]->[a]
,并在列表为空时返回[a]
。谢谢,这是我需要的。我还要学哈斯克尔,干杯,伙计们!第二个示例的最后一行也可以写成altHead_ux(x:x)=x
,因为实际上既没有使用a
也没有使用xs
。是的,我只是认为将它们作为变量名保留有助于可读性/理解。(它还显示了OP使用的(x:xs)
模式。)我想我现在明白了一些我以前从根本上误解的东西。谢谢你,当我完成我的版本时,我看到了它,它有点不对劲,但在其他方面还行。Quick Q:我意识到这不是正常的键入方式,但是如果列表不是空的,它是否可以返回整个列表,否则只返回x?你不能有一个函数,有时返回列表,有时返回单个值,因为它们是不同的类型。但是您可以将签名更改为a->[a]->[a]
,并在列表为空时返回[a]
。谢谢,这是我需要的。我还要学哈斯克尔,干杯,伙计们!