2013-08-29 53 views
1

我似乎無法成功與Fay排序字符串。我意識到,它連接到一個事實,即仙女的不支持類型類,但好像如果不工作一個真正的痛苦...fay:可以對字符串進行排序嗎?

import Prelude 

main :: Fay() 
main = print $ sort ["a", "c", "b"] 

輸出爲:

fay: ghc: 
Test.hs:4:16: 
    No instance for (Ord [Char]) 
     arising from a use of `sort' 
    Possible fix: add an instance declaration for (Ord [Char]) 
    In the second argument of `($)', namely `sort ["a", "c", "b"]' 
    In the expression: print $ sort ["a", "c", "b"] 
    In an equation for `main': main = print $ sort ["a", "c", "b"] 

如果我理解正確,我不能定義類型類型的實例,因爲Fay不支持類型類型(另外我猜如果可能的話,Fay開發者會這樣做)。那麼是否有解決方法,或者我必須JS JS做字符串排序?

編輯:從一月克里斯蒂安森的答案似乎正確的:我可以排序使用 「sortBy」,這似乎一見鍾情正確:

fay --html-wrapper Sort.hs 

回答

2

import Prelude 

main :: Fay() 
main = print $ sortBy strComp ["a", "c", "b"] 

strComp :: String -> String -> Ordering 
strComp (_:_) [] = GT 
strComp [] (_:_) = LT 
strComp [] [] = EQ 
strComp (x:xs) (y:ys) 
    | x < y = LT 
    | x > y = GT 
    | otherwise = strComp xs ys 

若要編譯我不是專家,但fay-basePrelude定義了幾個標準類型的實例,例如Eq的實例[a]。但是,它沒有爲[a]定義Ord的實例。據我所知,你不能自己定義一個實例。因此,您可能不得不求助於sortBy,它將一個附加函數作爲參數。這個函數用於比較列表中的兩個元素,也就是說,這個函數用於比較兩個字符串。你必須自己提供這個功能,但至少你不必使用javascript FFI。

1

考慮使用Fay.Text,如果啓用OverloadedStrings和RebindableSyntax在文件仙女將替換字符串常量與JS的字符串,這些都可以有一個奧德實例(但好像我忘了補充吧!打補丁或使用StandaloneDeriving直到我解決它)。像Data.Text一樣,這些效率更高,而且在使用FFI時也不會出現問題。

另外,我們可能很快會支持Eq和Ord實例,以及其他類型的類。

相關問題