简单的Haskell程序 - 语法错误

时间:2014-03-30 17:38:26

标签: haskell

我有一个简单的haskell程序,它返回一个特定数字的索引(比如“mylist”中的变量“i”,并且应该返回索引,如...“(Ind i)”。“Num”属于Int类型.nu​​ms被声明为列表。

对某些人来说这可能很容易,但是你可以帮助我,我的简单代码有什么问题吗?它说“解析错误输入`”'“。

list1 :: Int -> Int
list1 (Num i) = (do let j = [nums] !! i; return (Ind j));
....

我是哈斯克尔的新手。 :(帮助!

5 个答案:

答案 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

这对你有用吗?