【发布时间】:2020-10-24 22:34:25
【问题描述】:
谁能帮忙。
我不是 Haskell 程序员,我只知道一点点语言,很少。我已经在 Stack overflow 和其他地方查看了几篇帖子,尽管了解实际发生的情况,但我无法解决发生的问题。
我正在开发有关函数式编程的基本教学材料。在本材料中,除了 Haskell 之外,我还使用了另一种语言(非常简单)。在代码中,我遇到了 Haskell 中的数据类型问题。我使用的示例必须保持在相同级别的配置和操作难度,如下所示。
首先,代码必须尽可能简单,不使用语言函数或库,不使用otherwise或where,因为材料中使用的语言只是对所介绍的函数式编程理论的说明。
以下是可以工作的函数,但在有问题的函数中直接或间接使用。
my_reverse :: (Num a) => [a] -> [a]
my_reverse [] = []
my_reverse (x : xs) = my_reverse xs ++ [x]
my_size :: (Num a) => [a] -> Int
my_size [] = 0
my_size (x : xs) = 1 + my_size xs
my_getpos :: (Eq a, Num a) => a -> [a] -> Int
my_getpos _ [] = error "element does not exist in the list"
my_getpos n (x : xs) = if n == x then my_size xs else my_getpos n xs
我想要的是获取元素在列表中的位置。当我在 Haskell 提示符处执行语句时:
my_getpos 4 (my_reverse [1,2,3,4,5])
我得到了结果 3,这确实是意料之中的。此尝试出现问题。
my_find :: (Num a) => a -> [a] -> Int
my_find n (x : xs) = my_getpos n (my_reverse x : xs)
出现我无法更正的错误消息。 my_find n (x: xs) = my_getpos n (my_reverse x: xs) 行恰好发生 my_getpos 4 (my_reverse [1,2,3,4,5])强>。
在my_find函数中,我使用了与my_getpos函数相同的原型,即=> a -> [a] -> Int 。
我得到的信息是:
<interactive>:26:46: error:
* Couldn't match expected type `[Integer]' with actual type `a'
`a' is a rigid type variable bound by
the type signature for:
my_find :: forall a. Num a => a -> [a] -> Int
at <interactive>:25:1-37
* In the first argument of `my_reverse', namely `x'
In the first argument of `(:)', namely `my_reverse x'
In the second argument of `my_getpos', namely `(my_reverse x : xs)'
* Relevant bindings include
xs :: [a] (bound at <interactive>:26:16)
x :: a (bound at <interactive>:26:12)
n :: a (bound at <interactive>:26:9)
my_find :: a -> [a] -> Int (bound at <interactive>:26:1)
有Haskell经验的人可以帮助我吗?
提前感谢您抽出宝贵的时间来解答我的问题。
【问题讨论】:
-
看起来你只是漏掉了一些括号:
my_reverse x : xs应该是my_reverse (x : xs) -
请注意,您可以将其简化为简单的
my_find n xs = my_getpos n (reverse xs),因为您没有使用在模式匹配中解构的任何部分。然后,如果您想“排除”xs参数并写入my_find n = (my_getpos n) . reverse,则可以 -
你好,罗宾·齐格蒙德。首先,我感谢您能提供帮助并快速回复我的问题。你给了我两句话:第一,我怎么看不懂。我已经更改了括号位置无济于事。第二个使用“反向”功能,正如我在帖子中所说,我需要一个独立于内部语言功能的解决方案。目标是用最少的语言资源编写足够高的算法。
-
抱歉使用
reverse,你可以用你的my_reverse替换它(它做同样的事情),我只是打字太快了。我不确定您对我的第一条评论有什么误解,这非常明确。我承认我没有详细检查您的代码,可能还有其他问题,但是将这些括号放入是必要的第一步。请使用添加后遇到的错误来编辑您的问题。 -
my_find n (x: xs) = my_getpos n (my_reverse (x: xs))。我保证这将使您发布的错误消失。这就是您通过使用我在第一条评论中提出的确切建议更改代码所得到的。 (我还在第二条评论中以简化的形式发布了上述内容。)
标签: list haskell functional-programming position