Haskell错误"解析输入'if'"

时间:2017-11-19 18:01:14

标签: haskell if-statement compiler-errors list-comprehension

我有一个关于Haskell的问题,我试图只在一个列表中创建一个半数偶数的函数并返回最终列表,只有偶数个被修改(减半)与其余的元素没有动过。

但是当我尝试编译我的代码时,我给出了一个错误,说明"错误:解析错误输入'if'"而我无法找到解决方案。

halfEvens :: [ Int ] -> [ Int ]
halfEvens xs = [x|x<-xs]
                if x mod 2 == 0
                the x = x / 2
                else
                x = x

3 个答案:

答案 0 :(得分:4)

您的代码有多个问题:

  • [x|x<-xs]没有做任何有用的事情。这只会评估为xs
  • 如果您使用mod作为中缀运算符,则需要围绕它进行反引号
  • 您无法重新分配变量。 Haskell中then x = x / 2x = x是非法的。

但主要问题是你有一个空的列表理解([x|x<-xs]),if表达式只是浮动在它下面。我相信你的意图是将if置于理解之内。类似的东西:

halfEvens :: [Int] -> [Int]
halfEvens xs = [if x `mod` 2 == 0 then x `quot` 2 else x | x <- xs]

的变化:

main = do
  putStrLn . show $ halfEvens [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]

[1,1,3,2,5,3,7,4,9,0]

你的代码显示了对Haskell的一些严重误解。我建议坐下来拿一本好书然后试试所有的例子。 Haskell不是一门简单的语言。不要试图匆匆通过它。

答案 1 :(得分:3)

因此,您希望应用一个将偶数减半的函数,但仅留下奇数。我们可以使用前缀中的Int编写一个函数来对单个even执行此转换:

halfEven :: Int -> Int
halfEven x | even x = x `div` 2
           | otherwise = x

现在我们可以map列出Int

halfEvens :: [Int] -> [Int] halfEvens xs = map halfEven xs
halfEvens = map halfEven

或点免费:

halfEvens xs = [halfEven x | x <- xs]

或使用列表理解:

<?xml version="1.0" encoding="utf-8"?>
<resources>
  <style name="Theme.Transparent" parent="android:Theme">
    <item name="android:windowIsTranslucent">true</item>
    <item name="android:windowBackground">@android:color/transparent</item>
    <item name="android:windowContentOverlay">@null</item>
    <item name="android:windowNoTitle">true</item>
    <item name="android:windowIsFloating">true</item>
    <item name="android:backgroundDimEnabled">false</item>
  </style>
</resources>

答案 2 :(得分:2)

保留尽可能多的原始代码/意图,

halfEvens xs = [x | x <- xs, x <- [   -- instead of x = ...
                 if x `mod` 2 == 0
                   then {- x = -} x `div` 2
                   else {- x = -} x ]]

其类型推断为halfEvens :: Integral t => [t] -> [t]

有趣的是,我们可以使用x <- [...]构造在那里使用相同的变量名;它只会被阴影笼罩。但是没关系,因为我们只对新价值感兴趣。这样我们在心理上将其视为变量“更新”,当然,Haskell中没有更新变量。