我有一个关于Haskell的问题,我试图只在一个列表中创建一个半数偶数的函数并返回最终列表,只有偶数个被修改(减半)与其余的元素没有动过。
但是当我尝试编译我的代码时,我给出了一个错误,说明"错误:解析错误输入'if'"而我无法找到解决方案。
halfEvens :: [ Int ] -> [ Int ]
halfEvens xs = [x|x<-xs]
if x mod 2 == 0
the x = x / 2
else
x = x
答案 0 :(得分:4)
您的代码有多个问题:
[x|x<-xs]
没有做任何有用的事情。这只会评估为xs
。mod
作为中缀运算符,则需要围绕它进行反引号then x = x / 2
和x = x
是非法的。但主要问题是你有一个空的列表理解([x|x<-xs]
),if
表达式只是浮动在它下面。我相信你的意图是将if
置于理解之内。类似的东西:
halfEvens :: [Int] -> [Int]
halfEvens xs = [if x `mod` 2 == 0 then x `quot` 2 else x | x <- xs]
的变化:
|
)。/
无法与整数一起使用。 Use quot
or div
for integer division. 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中没有更新变量。