Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 返回以元组形式包含列表中前两个字符串的列表_String_List_Haskell_Greedy - Fatal编程技术网

String 返回以元组形式包含列表中前两个字符串的列表

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] -> [(

我正在编写一个Haskell函数,它接受一个字符串列表,并返回一个包含前两个字符串的列表作为元组作为结果。因此,示例输出为:

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)