Haskell As模式,将变量绑定到常量

kir*_*rov 3 haskell

(这段代码没有多大意义,但我需要此逻辑才能在其他复杂函数中使用):

import Data.List

elemIndex1 xss@(x:xs) = 
    if (x == ' ') 
    then (elemIndex x xss) 
    else (elemIndex1 xs)
Run Code Online (Sandbox Code Playgroud)

所以我想这个功能给这个:

elemIndex1 "qwe asd zxc"
Just 3
Run Code Online (Sandbox Code Playgroud)

相反,它给出了以下内容:

elemIndex1 "qwe asd zxc"
Just 0
Run Code Online (Sandbox Code Playgroud)

据我了解,在else子句中,xss实际上变成了xs。所以我的问题是:是否有可能将变量(x:xs)绑定到常量并在任何迭代中使用该常量?

col*_*ole 5

您似乎期望xss@(x:xs)达到以下条件:

  • xss:赋予elemIndex1 的原始字符串
    • x:任意调用的第一个字符
    • xs:任意调用的其余字符

例如,当您x首先匹配一个空格时

xss = "qwe asd zxc"
x = ' '
xs = "asd zxe"
Run Code Online (Sandbox Code Playgroud)

这不是模式匹配的工作方式。xss实际上等于x:xs,因此在该示例中为" asd zxc"

如果要保留对函数的第一次调用,可以使用在原始函数范围内调用的帮助器函数。

xss = "qwe asd zxc"
x = ' '
xs = "asd zxe"
Run Code Online (Sandbox Code Playgroud)

请注意,str辅助函数主体中的I引用在其调用中将是一个常量。

就其价值而言,您所设计的示例似乎等同于,elemIndex ' '因为它通过返回来处理字符串中没有空格的情况Nothing