fay:可以排序字符串吗?

时间:2013-08-29 22:14:55

标签: fay

我似乎无法用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 FFI来进行字符串排序?

编辑: Jan Christiansen的答案看似正确:我可以使用“sortBy”进行排序,这看起来是正确的:

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 --html-wrapper Sort.hs

2 个答案:

答案 0 :(得分:2)

我不是fay的专家,但fay-base的{​​{3}}定义了几个标准类型类的实例,例如Eq [a]的实例。但是,它没有为Ord定义[a]的实例。据我所知,你不能自己定义一个实例。因此,您可能不得不求助于sortBy,它将附加函数作为参数。此函数用于比较列表中的两个元素,也就是说,在您的情况下,此函数用于比较两个字符串。你必须自己提供这个功能,但至少你不必使用javascript FFI。

答案 1 :(得分:1)

考虑使用Fay.Text,如果你在文件fay中启用OverloadedStrings和RebindableSyntax将用JS字符串替换字符串文字,这些可以有一个Ord实例(但似乎我忘了添加它!修补或使用StandaloneDeriving直到我解决它)。与Data.Text一样,这些更有效,并且在使用FFI时也更少问题。

此外,我们可能会很快支持Eq和Ord实例,以及其他类型类。