没有使用'/'产生的(Fractional Int)实例

时间:2015-09-07 15:23:47

标签: haskell

我撞墙了。

此代码

profileMatrix = map (map (\x -> (fst x, (snd x) / (length molseqs)))) (makeProfileMatrix molseqs)

给我这个错误

No instance of (Fractional Int) arising from a use of '/'
In the expression: (snd x) / (length molseqs)
In the expression: (fst x, (snd x) / (length molseqs))
In the first arguemnt of 'map' namely
  '(\x -> (fst x, (snd x) / (length molseqs)))'

使用fromIntegral也会给我一个错误:

profileMatrix = map (map (\x -> (fst x, (fromIntegral (snd x)) / (fromIntegral (length molseqs))))) (makeProfileMatrix molseqs)

即使是fromIntegral的不同组合也会出现错误:

profileMatrix = map (map (\x -> (fst x, (snd x) / (fromIntegral (length molseqs))))) (makeProfileMatrix molseqs)

profileMatrix = map (map (\x -> (fst x, (fromIntegral (snd x)) / (length molseqs)))) (makeProfileMatrix molseqs)

一些澄清:

  • makeProfileMatrix molseqs会返回一个[[(Char, Int)]](一系列的操作列表,将Chars与Ints配对)。
  • 这意味着代码中的'x'将成为一个问题,即('A', 3),这已被证实可以正常工作。

我该如何解决这个问题?任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:2)

:t(/)取分数

:t length 返回一个整数

您可以使用div指令代替。但我认为你不会四舍五入。

或者你可以将长度的返回结果包装成fromIntegral函数。

这是我的ghci中的一个例子。

(3)/(fromIntegral $ length [1,2,3])

我认为从积分中可以得到你想要的四舍五入。

答案 1 :(得分:2)

我不知道makeProfileMatrix做了什么,或者确实知道molseqs的类型是什么,但这里看起来有点合理 -

> import Data.List (group)
> let molseqs = ["aaabb", "aabbcc", "aabccc"]
> let rle = map (\g -> (head g, length g)) . group
> let makeProfileMatrix = map rle

有一种更好的定义原始功能的方法

> let innerFunc xs = map $ \(a,b) -> (a, b / length xs)
> let pfm molseqs = map (innerFunc molseqs) (makeProfileMatrix molseqs)

导致错误"无法推断(分数Int)由..."你注意到的错误。一种方法是使用fromIntegral将所有内容转换为双重

> let innerFunc xs = map $ \(a,b) -> (a, fromIntegral b / fromIntegral (length xs))
> let pfm molseqs = map (innerFunc molseqs) (makeProfileMatrix molseqs)

现在你应该看到你期望的东西 -

> makeProfileMatrix molseqs
[[('a',3),('b',2)],[('a',2),('b',2),('c',2)],[('a',2),('b',1),('c',3)]]

> pfm molseqs
[[('a',1.0),('b',0.6666666666666666)],[('a',0.6666666666666666),('b',0.6666666666666666),('c',0.6666666666666666)],[('a',0.6666666666666666),('b',0.3333333333333333),('c',1.0)]]