Dan*_*ler 0 conditional haskell
我正在尝试编写一个接受字符串的辅助函数,如果字符串有多个空格,则将其转换为一个字符串.这是代码:
getSpaces :: String -> String
getSpaces index =
if (length index) == 1 then index
else
if isInfixOf " " index then index = " "
else index
Run Code Online (Sandbox Code Playgroud)
当我尝试将模块加载到GHCI时,我收到错误:
Prelude> :l Utilities
[1 of 1] Compiling Utilities ( Utilities.hs, interpreted )
Utilities.hs:55:42: error:
parse error on input ‘=’
Perhaps you need a 'let' in a 'do' block?
e.g. 'let x = 5' instead of 'x = 5'
|
55 | if isInfixOf " " index then index = " "
| ^
Failed, no modules loaded.
Run Code Online (Sandbox Code Playgroud)
为什么我无法将索引重新分配给单个空格?
为什么我无法将索引重新分配给单个空格?
因为在Haskell中你无法重新分配任何东西.实际上你甚至都没有指定,你宣布(这是相关的,但不同的).即使在某些情况下,它可能看起来像你重新分配变量(如在do块中,你不重新分配,但你通过声明一个具有相同名称的新变量来影响变量,同样这有点相关,但有很多在我们看到不同行为的情况下,例如在循环中,我们不能在每次迭代时遮蔽变量).
要回答你的问题,你可能想要返回一个带有一个空格的字符串,我们可以通过编写:
getSpaces index = if (length index) == 1 then index else
if isInfixOf " " index then " " else indexRun Code Online (Sandbox Code Playgroud)
但是,这仍然相当不优雅,而且它相当不安全,因为在无限的情况下String,这将开始循环:length保持循环直到列表(字符)耗尽,并且这可能永远不会发生.此外,即使它不会停留在一个无限循环,那么它仍然是不可取的,因为它运行在O(n)的(与ñ列表的长度).因此对于长列表来说,这是低效的.
通常在Haskell中,使用模式和保护的组合来区分可能的值.您的案例可以映射到:
getSpaces :: String -> String
getSpaces st@[_] = st
getSpaces st | isInfixOf " " st = st
| otherwise = " "
Run Code Online (Sandbox Code Playgroud)
然而,这仍然会循环,如果列表具有无限大小,sinze isInfixOf一直在寻找空间,直到它找到一个空间,或者它已经String耗尽.
由于isPrefixOf与作为搜索模式与串一个事实上字符意味着我们看看如果字符串包含空格,我们可以更换,与elem和查找的字符' ':
getSpaces :: String -> String
getSpaces st@[_] = st
getSpaces st | elem ' ' st = st
| otherwise = " "
Run Code Online (Sandbox Code Playgroud)