Haskell技术求助:如何将列表中每个元素除以变量?
解决Haskell列表元素批量除以变量的问题
嘿,作为刚接触Haskell的新手,碰到这种类型和语法的坑太正常啦!我来帮你拆解一下问题出在哪,再给你几个能直接跑起来的解决方案~
首先先看看你写的代码里的核心问题:
- 语法结构混乱:你的
where子句里把多个变量定义揉在了一起,比如divhs = div hs hs = tupleTest1 xs j = jot xs,Haskell的where块里每个定义需要单独成行,而且必须保证变量在被使用前已经被定义,否则编译器根本看不懂你要表达什么。 - 函数用法混淆:你混用了
div和(/),这俩在Haskell里是完全不同的函数:div是整数除法(只接受整数类型,返回整数),而(/)是浮点数除法(要求操作数是Fractional类型,比如Float/Double)。
先给你最基础的正确实现
假设你的需求是:给定一个列表,和一个除数j,把列表里的每个元素都除以j,分两种情况给你写代码:
情况1:浮点数除法(支持小数结果)
-- 类型签名:约束a是可做除法的类型,输入列表和除数,返回结果列表 divideBy :: Fractional a => [a] -> a -> [a] divideBy xs j = map (/ j) xs
这个函数直接就能用,比如你调用divideBy [1.0,2.0,3.0] 2.0,会得到[0.5,1.0,1.5]。如果你的列表里是整数,想要得到小数结果,需要先把整数转成浮点数:
divideByIntToFloat :: [Int] -> Int -> [Double] divideByIntToFloat xs j = map (\x -> fromIntegral x / fromIntegral j) xs
情况2:整数除法(只保留整数部分)
如果你要做整数除法,就用div函数,注意它的用法是中缀形式x div j:
divideByInt :: Integral a => [a] -> a -> [a] divideByInt xs j = map (\x -> x `div` j) xs
调用例子:divideByInt [4,5,6] 2会得到[2,2,3]。
修正你原来的代码结构
假设你的tupleTest1 xs是用来获取要处理的列表,jot xs是用来获取除数j,那修正后的代码应该是这样的:
diver xs = map divhs hs where hs = tupleTest1 xs -- 先定义要处理的列表 j = jot xs -- 再定义除数 divhs x = x / j -- 定义每个元素的处理函数(浮点数除法) -- 如果是整数除法就改成:divhs x = x `div` j
这样where块的结构清晰了,每个变量都先定义再使用,编译器就能正确解析了。
额外提醒:类型推导的坑
Haskell是强类型语言,如果你的列表是整数类型,直接用map (/ j) hs会报错,因为整数没有Fractional实例。这时候要么像上面那样用fromIntegral转类型,要么在定义列表的时候就指定浮点数,比如[1.0,2.0]而不是[1,2]。
内容的提问来源于stack exchange,提问作者BenjBarrett
相关产品推荐
相关产品推荐

