Haskell如何将float添加到整数列表的所有成员

Yit*_*dez 0 haskell

我是Haskell的新手,但我正在尝试向Haskell中的整数列表的所有成员添加一个浮点数,而我遇到了错误等问题.

基本上

addAll xs = map (+3.5) xs
Run Code Online (Sandbox Code Playgroud)

其中xs是整数列表.

Chr*_*tin 7

在添加之前,您需要将每个转换Integer为a .FloatFloat

你可以用fromInteger它.它的类型是

Num a => Integer -> a
Run Code Online (Sandbox Code Playgroud)

为了我们的目的,这是专门为

Integer -> Float
Run Code Online (Sandbox Code Playgroud)

所以这是addAll函数的样子:

addAll :: [Integer] -> [Float]
addAll xs = map (\x -> fromInteger x + 3.5) xs
Run Code Online (Sandbox Code Playgroud)

GHCi中的示例用法:

?> addAll [1, 2, 3]
[4.5,5.5,6.5]
Run Code Online (Sandbox Code Playgroud)


eps*_*lbe 5

您期望结果列表是什么?

它可以是- [Float]或者[Integer]在Haskell中你应该明确这一点.

1. [Integer]

round在乘法之前,您需要浮点数:

map (+ (round (3.5 :: Float))) [1..(10 :: Integer)]
Run Code Online (Sandbox Code Playgroud)

2. [Float]

或者转换整数 fromInteger

[3.5 + fromInteger x | x <- xs]
map ((+3.5) . fromInteger) xs
Run Code Online (Sandbox Code Playgroud)

因为只有两个加号都是相同的类型才能添加数字,你可以在类型签名中看到这个

(+) :: Num a => a -> a -> a
Run Code Online (Sandbox Code Playgroud)

所有as必须是相同的并且是Num-typeclass的一个实例(如果你有经验的话,Java中的接口很相似).

注意:Haskell 1中没有自动转换.

1:除了数字文字像0,1,2…它们使用被转换fromInteger,像数字文本1.1,2.2等等都由转换fromRationalString文字当启用OverloadedStringsfromString.