2016-12-07 8 views
-4

リスト内のすべての要素の合計を取得しようとしています。そして、私は要素の量を持っています。私は、合計をこのリストのすべての要素の平均を得るための量で除算したいと思います。そして、部門は私に修正できないエラーを返します。 マイコード:Haskellでの除算が間違ったタイプのために機能しない

module HA 

where 

import FPH 
import Data.List.Split 
import Data.Char 
import qualified Data.Text hiding (length) 

s1 = splitOn " " sonnet18 
s2 = splitOn " " sonnet73 

countSubStrs str sub = length $ Data.Text.breakOnAll (Data.Text.pack sub) (Data.Text.pack str) 

task :: IO() 
task = do 
    let wordLengths = map length 
    let wl1 = wordLengths s1 
    let wl2 = wordLengths s2 
    let getsum1 = sum wl1 
    let ln [] = 0 
    let ln (x:xs) =1 + ln xs 
    let average = wl1 `quot` getsum1 
    print average 

エラー:

Couldn't match expected type '[Int]' with actual type 'Int' 
In the second argument of `quot´, namely `getsum1´ 
In the expression: wl1 `quot´ getsum1 
In an equation for `average´: average = wl1 `quot´ getsum1 
+0

「s1」と「s2」とは何ですか? – Sibi

+1

[MCVE](http://stackoverflow.com/help/mcve) –

+0

ああ申し訳ありません。 s1とs2は型リストの2つのソネットです。私はSplitOnでテキストの文字列をリストに変換しました。 –

答えて

1

はいくつかの種類を歩くことから始めるのをしてみましょう:私たちはここを見てする必要があります

task :: IO() 
task = do 
    let wordLengths = map length -- (:: [[Char]] -> [Int]) 
    let wl1 = wordLengths s1  -- (:: [Int]) 
    let wl2 = wordLengths s2  -- (:: [Int]) 
    let getsum1 = sum wl1  -- (:: Int) 
    let ln [] = 0 
    let ln (x:xs) =1 + ln xs 
    let average = wl1 `quot` getsum1 
    print average 

用語はwl1getsum1あり、以来、私たちのエラーは、それらの操作に伴うエラーです。まず、機能quot

ghci>> :t quot 
Integral a => a -> a -> a 

だから我々は、型クラスIntegralのメンバーである二つの引数に適用することができます。どちらもその制約を満たす引数ですか?我々はgetsum1が上記のタイプIntを持っていたと言いました。一方、wl1は、タイプ[Int]です。私たちの問題があります。

あなたが概説した内容に基づいて、これを修正するにはどうすればよいですか?長さの合計をリスト内の項目の数で除算したいと考えています(元の[[Char]]の単語の平均長さを取得すると思われます)。したがって、getsum1length wl1で除算したいと思うでしょう(どのような形式の結果を期待するかによって、これを行う方法はいくつかあります)。

関連する問題