我撞墙了。
此代码
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配对)。('A', 3)
,这已被证实可以正常工作。我该如何解决这个问题?任何帮助表示赞赏。
答案 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)]]