2016-01-23 57 views
1

以下示例是我在Haskell中解決「取N個最頻繁的單詞」的嘗試。Haskell中的多態最大堆

我想打heap功能兩個StringText工作。 它適用於任何這些,但不是兩個,因爲a是一個「剛性類型變量」。

Couldn't match type ‘a’ with ‘String’ 
     ‘a’ is a rigid type variable bound by 
      the type signature for heap :: H.Heap H.FstMaxPolicy (Occur, a) 

什麼是根本問題?

{-# LANGUAGE OverloadedStrings, ExplicitForAll #-} 

module Main where 

import Data.MultiSet as M 
import Data.String 
import Data.Tuple as T 
import Data.Text(Text) 
import qualified Data.Text as T 
import qualified Data.Heap as H 

main = undefined 
solution = H.take 3 heap 
heap :: forall a. H.Heap H.FstMaxPolicy (Occur, a) 
-- heap = foldr H.insert H.empty heapItems 
heap = undefined 
heapItems = fmap T.swap list 
list = toOccurList frequencyDesc 
frequencyDesc = foldr M.insert M.empty myWords 
myWords :: forall a. (IsString a) => [a] 
myWords = [ "a", "b", "a", "b", "c" ] 
+0

其實它更是一個http://stackoverflow.com/q/34398326/190376複製。 –

+0

@ReidBarton我重新打開它,關閉你指出的新問題。但是,SO沒有向我顯示現在關閉的選項。 :/ – Sibi

+0

還有[典型的MR問題](http://stackoverflow.com/q/32496864/791604)。 –

回答

2

有什麼潛在的問題?

單態限制。該限制使得Haskell類型frequencyDescMultiSet String而不是forall a. (IsString a) => MultiSet a

如果明確關閉的限制,結果編譯:

{-# LANGUAGE OverloadedStrings, ExplicitForAll, NoMonomorphismRestriction #-} 

module Main where 

import Data.MultiSet as M 
import Data.String 
import Data.Tuple as T 
import Data.Text(Text) 
import qualified Data.Text as T 
import qualified Data.Heap as H 

main = undefined 
solution = H.take 3 heap 
heap :: forall a. (Ord a, IsString a) => H.Heap H.FstMaxPolicy (Occur, a) 
heap = foldr H.insert H.empty heapItems 
-- heap = undefined 
heapItems = fmap T.swap list 
list = toOccurList frequencyDesc 
frequencyDesc = foldr M.insert M.empty myWords 
myWords :: forall a. (IsString a) => [a] 
myWords = [ "a", "b", "a", "b", "c" ] 

而且,與限制,但更明確的類型簽名(這樣,Haskell沒有觸發限制),就可以得到它編譯:

{-# LANGUAGE OverloadedStrings, ExplicitForAll #-} 

module Main where 

import Data.MultiSet as M 
import Data.String 
import Data.Tuple as T 
import Data.Text(Text) 
import qualified Data.Text as T 
import qualified Data.Heap as H 

main = undefined 
solution = H.take 3 heap 
heap :: forall a. (Ord a, IsString a) => H.Heap H.FstMaxPolicy (Occur, a) 
heap = foldr H.insert H.empty heapItems 
-- heap = undefined 
heapItems :: forall a. (Ord a, IsString a) => [(Occur, a)] 
heapItems = fmap T.swap list 
list :: forall a. (Ord a, IsString a) => [(a, Occur)] 
list = toOccurList frequencyDesc 
frequencyDesc :: forall a. (Ord a, IsString a) => MultiSet a 
frequencyDesc = foldr M.insert M.empty myWords 
myWords :: forall a. (IsString a) => [a] 
myWords = [ "a", "b", "a", "b", "c" ]