String 返回以元组形式包含列表中前两个字符串的列表
我正在编写一个Haskell函数,它接受一个字符串列表,并返回一个包含前两个字符串的列表作为元组作为结果。因此,示例输出为:String 返回以元组形式包含列表中前两个字符串的列表,string,list,haskell,greedy,String,List,Haskell,Greedy,我正在编写一个Haskell函数,它接受一个字符串列表,并返回一个包含前两个字符串的列表作为元组作为结果。因此,示例输出为: listtuple ["bride", "zilla", "crazy", "women"] = [("bride", "villa")] listtuple ["basketball", "football"] = [("basketball", "football")] 我是这样想的: listtuple :: Eq a => [Str a] -> [(
listtuple ["bride", "zilla", "crazy", "women"] = [("bride", "villa")]
listtuple ["basketball", "football"] = [("basketball", "football")]
我是这样想的:
listtuple :: Eq a => [Str a] -> [(Str a, Str a)]
listtuple xs = [(x,y) | x <- xs !! 0, y <- xs !! 1]
listtuple::Eq a=>[Str a]->[(Str a,Str a)]
listtuple xs=[(x,y)| x我可以看到您的代码中有一些错误,但是如果您有关于为什么代码不工作的特定问题,请告诉我
首先,您提供的类型签名无效。String
是一个无参数的数据结构,stra
什么都不是,除非您自己定义了一个名为Str
的数据结构。String
的列表也不需要您提供的相等约束,因为编译器总是这样ady知道String
是Eq
的一个实例
第二,你在列表中使用了列表理解语法(Hykell将尝试在绑定元素<代码> x>代码>之前评估<代码> xs!!0代码>代码。因为这是列表理解,这可能不会立即失败,因为<代码> xs<代码>是“代码>字符串< /代码> s的列表。(实际上是
Char
)的列表,但最终将从xs中的第一个和第二个字符串中提取Char
的元组
下面是一个使用模式匹配的简单解决方案,它可以生成您想要的内容
listtuple :: [a] -> [(a, a)]
listtuple (x:y:zs) = [(x, y)]
请注意,这不是一个total函数(即,如果向其传递少于两个元素的列表,则会导致错误)。当向其传递一个空列表或一个元素列表时,可能会返回空列表,从而使其成为total函数,这是否符合您的预期目的
这里有一个替代版本,你可能会发现它适合你用来编写自己版本的心智模型
listtuple xs = [(x, y)]
where
x = xs !! 0
y = xs !! 1
我可以看到你的代码中有一些错误,但是如果你有一个关于为什么你的代码不能工作的具体问题,请告诉我
首先,您提供的类型签名无效。String
是一个无参数的数据结构,stra
什么都不是,除非您自己定义了一个名为Str
的数据结构。String
的列表也不需要您提供的相等约束,因为编译器总是这样ady知道String
是Eq
的一个实例
第二,你在列表中使用了列表理解语法(Hykell将尝试在绑定元素<代码> x>代码>之前评估<代码> xs!!0代码>代码。因为这是列表理解,这可能不会立即失败,因为<代码> xs<代码>是“代码>字符串< /代码> s的列表。(实际上是
Char
)的列表,但最终将从xs中的第一个和第二个字符串中提取Char
的元组
下面是一个使用模式匹配的简单解决方案,它可以生成您想要的内容
listtuple :: [a] -> [(a, a)]
listtuple (x:y:zs) = [(x, y)]
请注意,这不是一个total函数(即,如果向其传递少于两个元素的列表,则会导致错误)。当向其传递一个空列表或一个元素列表时,可能会返回空列表,从而使其成为total函数,这是否符合您的预期目的
这里有一个替代版本,你可能会发现它适合你用来编写自己版本的心智模型
listtuple xs = [(x, y)]
where
x = xs !! 0
y = xs !! 1
简单的答案是
listtuple :: [a] -> [(a,a)]
listtuple (x:y:_) = [(x,y)]
listtuple _ = []
由于您的列表总是包含一个项目或不包含任何项目,因此最好使用Maybe
,这正好符合此目的
listtuple2 :: [a] -> Maybe (a,a)
listtuple2 (x:y:_) = Just (x,y)
listtuple2 _ = Nothing
简单的答案是
listtuple :: [a] -> [(a,a)]
listtuple (x:y:_) = [(x,y)]
listtuple _ = []
由于您的列表总是包含一个项目或不包含任何项目,因此最好使用Maybe
,这正好符合此目的
listtuple2 :: [a] -> Maybe (a,a)
listtuple2 (x:y:_) = Just (x,y)
listtuple2 _ = Nothing
你可能想做的是:
listtuple xs =
let x = xs !! 0
y = xs !! 1
in (x, y)
请注意,这与您所写的不同。原因是您所写的列表理解翻译为以下内容:
do x <- xs !! 0 -- Treat the first element of xs as a list
y <- xs !! 1 -- Treat the second element of xs as a list
return (x, y)
您可能想做的是:
listtuple xs =
let x = xs !! 0
y = xs !! 1
in (x, y)
请注意,这与您所写的不同。原因是您所写的列表理解翻译为以下内容:
do x <- xs !! 0 -- Treat the first element of xs as a list
y <- xs !! 1 -- Treat the second element of xs as a list
return (x, y)