Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.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
If statement 列出Haskell中的理解和递归if语句_If Statement_Haskell_Recursion_Focus - Fatal编程技术网

If statement 列出Haskell中的理解和递归if语句

If statement 列出Haskell中的理解和递归if语句,if-statement,haskell,recursion,focus,If Statement,Haskell,Recursion,Focus,我目前正在以多种方式练习Haskell。 使用列表创建大量有趣的东西。 现在我(认为)在理解if语句方面遇到了问题 我想做的是制作一个焦点列表,将焦点转移到最左边的项目。 焦点列表已经相当棘手,基本上是两个独立的列表。 它还将整个列表一分为二,并反转后面的列表 比如说。如果您想制作一个[0,1,2,3,4,5]的焦点列表,并希望焦点集中在3上,那么焦点列表将是[3,4,5][2,1,0] 我已经做了三个具体的函数。 使focuslist数据类型为: data FocusList a=FocusL

我目前正在以多种方式练习Haskell。 使用列表创建大量有趣的东西。 现在我(认为)在理解if语句方面遇到了问题

我想做的是制作一个焦点列表,将焦点转移到最左边的项目。 焦点列表已经相当棘手,基本上是两个独立的列表。 它还将整个列表一分为二,并反转后面的列表

比如说。如果您想制作一个[0,1,2,3,4,5]的焦点列表,并希望焦点集中在3上,那么焦点列表将是[3,4,5][2,1,0]

我已经做了三个具体的函数。 使focuslist数据类型为:

data FocusList a=FocusList{forward::[a],backward::[a]}

您可以使用

fromList::[a]->FocusList a
fromList=焦点列表[]
将其从焦点列表更改回列表的操作:

toList::FocusList a->[a]
toList(焦点列表fw bw)=反向bw++fw
将其向左移动一次,将[0,1,2,3,4,5]更改为[0,1,2,3,4,5],现在看起来像[2,3,4,5][0,1]作为焦点列表:

goLeft::FocusList a->FocusList a
高尔夫球场(焦点列表fw(f:bw))=焦点列表(f:fw)bw
现在,说到要点。如果我把它一直移到左边。我想使用高尔夫球,直到列表的长度为1。我在考虑使用递归if语句,直到第一个列表的长度等于1。如果不是的话就用高尔夫

所以我想到了一个简单的if语句。这(目前)根本不起作用。 它使用
FocusList a->FocusList a

最左侧(FocusList-fw(f:bw))=if(长度(FocusList-fw)==1)
然后焦点列表(f:fw)bw
返回最左边
其他焦点列表fw(f:bw)

我是用蟒蛇的方式想的。这似乎不起作用。如何使它在逻辑上递归?

不要使用
长度,因为它必须扫描整个列表,所以需要花费O(N)。如果您改为使用模式匹配,在这种情况下,您只需支付O(1)成本

一个简单的方法是使用两个方程,一个接一个地尝试

leftMost :: FocusList a -> FocusList a
-- if there's only one backward item, leave the list as it is
leftMost (FocusList fw [f]) = FocusList fw [f]
-- otherwise, goLeft, then recurse
leftMost fl                 = leftMost (goLeft fl)
模式
[f]
仅匹配具有单个项的列表。它相当于
(f:[])

请注意,如果后面的部分为空,上面的代码将崩溃。如果这是一个问题,你需要通过添加更多的方程式来解决

或者,可以使用as模式缩短代码:

leftMost :: FocusList a -> FocusList a
leftMost fl@(FocusList fw [f]) = fl    -- fl is the whole input
leftMost fl                    = leftMost (goLeft fl)
如果我们愿意,我们还可以内联
goLeft

leftMost :: FocusList a -> FocusList a
leftMost fl@(FocusList fw [f]) = fl
leftMost (FocusList fw (f:bw)) = leftMost (FocusList (f:fw) bw)
甚至可以处理上面提到的空向后列表问题:

leftMost :: FocusList a -> FocusList a
leftMost fl@(FocusList fw     [f])    = fl
leftMost    (FocusList fw     (f:bw)) = leftMost (FocusList (f:fw) bw)
leftMost    (FocusList (f:fw) [])     = FocusList fw [f]
leftMost    (FocusList []     [])     = error "leftMost: empty list"
最后一个案例是指一个空列表,很难以合理的方式处理。您可以选择使用错误消息崩溃(如上所述),返回空列表(这是预期的结果吗?),或者通过返回
Maybe(FocusList a)
将错误报告给调用者。

“right”和“left”是更有用的名称。此外,将右侧组件放在左侧也会让人困惑。此外,哈斯克尔是一位杰出的艺术家。