If statement 列出Haskell中的理解和递归if语句
我目前正在以多种方式练习Haskell。 使用列表创建大量有趣的东西。 现在我(认为)在理解if语句方面遇到了问题 我想做的是制作一个焦点列表,将焦点转移到最左边的项目。 焦点列表已经相当棘手,基本上是两个独立的列表。 它还将整个列表一分为二,并反转后面的列表 比如说。如果您想制作一个[0,1,2,3,4,5]的焦点列表,并希望焦点集中在3上,那么焦点列表将是[3,4,5][2,1,0] 我已经做了三个具体的函数。 使focuslist数据类型为: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
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”是更有用的名称。此外,将右侧组件放在左侧也会让人困惑。此外,哈斯克尔是一位杰出的艺术家。