我建立舒適通過一些Haskell的玩具問題去,我已經寫了下面的代碼斑點「對於所有」哈斯克爾
multipOf :: [a] -> (Int, a)
multipOf x = (length x, head x)
gmcompress x = (map multipOf).group $ x
成功地瓶坯以下操作
gmcompress [1,1,1,1,2,2,2,3] = [(4,1),(3,2),(1,3)]
現在我想要這個函數,而不是告訴我該集合中的一個元素具有多重性1,只是讓它獨立。所以要給出結果[(4,1),(3,2),3]代替。如果對於所有重數爲1的元素有一種說法(無論是在將列表變爲一對之後還是之後),將其作爲一個元素留下,其他,配對。我最初的,天真的想法是做以下事情。
multipOf :: [a] -> (Int, a)
multipOf x = if length x = 1 then head x else (length x, head x)
gmcompress x = (map multipOf).group $ x
但是這是行不通的。我認爲,因爲then
和else
子句有不同的類型,不幸的是,您不能逐段定義函數的(共)域。我該如何解決這個問題?
您所需的輸出沒有(不能)按原樣鍵入檢查。您可以將其更改爲ADT,但原始代碼更好。 – Mephy
類似'[(1,2),(3,2)]''的列表的類型爲'Num a => [(a,a)]''。但是'[(4,1),(3,2),3]'不會在haskell中進行類型檢查。 – Michael
我投票結束這個問題,因爲它似乎並沒有_answer_,除了「你不能用靜態類型語言來做到這一點」(或者事實上「這就是靜態類型的要點」)。請[編輯你的問題](http://stackoverflow.com/posts/33312250/edit)如果你覺得你可以澄清你問的問題。 –