2013-08-29 52 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实例,以及其他类型的类。

相关问题