我有一个简单的haskell程序,它返回一个特定数字的索引(比如“mylist”中的变量“i”,并且应该返回索引,如...“(Ind i)”。“Num”属于Int类型.nums被声明为列表。
对某些人来说这可能很容易,但是你可以帮助我,我的简单代码有什么问题吗?它说“解析错误输入`”'“。
list1 :: Int -> Int
list1 (Num i) = (do let j = [nums] !! i; return (Ind j));
....
我是哈斯克尔的新手。 :(帮助!
答案 0 :(得分:1)
你可能想要这样的东西:
find :: Eq a => a -> [a] -> Int
find i [] = -1 -- not found
find i (x:xs) = if i==x then 0 else 1 + find i xs
以上不是最优雅的解决方案,但仅使用基本概念。
另一种变体可能是
find :: Eq a => a -> [a] -> Int
find i list = go 0 list
where go _ [] = -1 -- not found
go n (x:xs) = if i==x then n else go (n+1) xs
但是,您应该返回Nothing而不是-1
,即使这需要将返回类型从Int
更改为Maybe Int
。这也是由elemIndex库函数完成的,它解决了这个任务。
答案 1 :(得分:1)
使用库函数更方便,1)elemIndex将返回第一次出现,2)elemIndices将返回所有元素。这是基于0的索引。
答案 2 :(得分:0)
如果要使用单行do
表示法,则需要看起来像do {x; y; z}
- 圆括号不足以分隔它。但是这看起来根本不需要do
- 实际上我根本无法弄清楚你的函数应该做什么,所以我无法为你修复它。这个功能的目的是什么?
答案 3 :(得分:0)
不需要do
符号,因为这应该是一个纯函数。什么是nums
?它应该是list1
的论据吗? Ind
是构造函数,还是您尝试返回读取"Ind "++ show j
的字符串?最后,在这里使用!!
不合适 - 它会查找列表中的i
项,而我认为您希望在列表中找到等于i
的项目。 / p>
我建议通过手动递归练习来解决这个问题,然后查看Data.List
以获得更加惯用的解决方案。这是一个简单的递归版本:
list1 :: Eq a => [a] -> a -> Maybe Int
list1 ls item = helper ls item 0
where helper :: Eq a => [a] -> a -> Int -> Maybe Int
helper [] _ _ = Nothing
helper (x:xs) m n
| x == m = Just n
| otherwise = helper xs m (n+1)
答案 4 :(得分:0)
这就是我将如何处理这个问题:将符号限制为最终调用,在本例中是主函数。其余的都是纯粹的。
nums = [1,2,3]
list1 aList aNumber = list2 aList aNumber 0
list2:: [Int] -> Int -> Int -> Int
list2 [] aNumber aCount = 0
list2 (h:xs) aNumber aCount = if h == aNumber then aCount + 1
else list2 xs aNumber (aCount + 1)
main = do
let index = list1 [1,2,3] 3
putStrLn $ show index
这对你有用吗?