til*_*boy 1 haskell pattern-matching parse-error
执行99-Haskell问题的第三个(我目前正在尝试学习该语言)我尝试将模式匹配以及递归合并到我的函数中,现在看起来像这样:
myElementAt :: [a] -> Int -> a
myElementAt (x ++ xs) i =
if length (x ++ xs) == i && length xs == 1 then xs!!0
else myElementAt x i
Run Code Online (Sandbox Code Playgroud)
哪能给我Parse error in pattern: x ++ xs.问题:
注意:我知道这是一个非常糟糕的算法,但我自己设定了编写该函数的挑战,包括递归和模式匹配.我也试过不使用!!运算符,但这对我来说很好,因为它真正做的唯一事情(或者如果编译它应该做)是将单元素列表转换为该元素.
Haskell有两种不同的价值级实体:变量(这也包括函数,中缀运算符++等)和构造函数.两者都可以在表达式中使用,但只有构造函数也可以用在模式中.
在任何一种情况下,很容易判断你是在处理变量还是构造函数:构造函数总是以大写字母(例如Nothing,True或StateT)开头,或者如果是中缀,则以冒号(:,:+)开头.其他一切都是变数.从根本上说,不同之处在于构造函数始终是来自预定义集合的唯一,可立即匹配的值(即,data定义的替代方案),而变量可以只具有任何值,并且通常原则上不可能唯一地区分不同的变量,特别是如果它们具有函数类型.
你的实际上就是一个很好的例子:为了使模式匹配x ++ xs有意义,必须有一种独特的方式可以在表单中写入输入列表x ++ xs.好吧,但是,比方说[0,1,2,3],有多种不同的方法可以做到这一点:
[] ++[0,1,2,3]
[0] ++ [1,2,3]
[0,1] ++ [2,3]
[0,1,2] ++ [3]
[0,1,2,3]++ []
Run Code Online (Sandbox Code Playgroud)
运行时应该选择哪一个?