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 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
4

2 回答 2

2

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

于 2013-09-01T10:09:25.017 回答
1

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

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

于 2013-09-02T18:13:23.510 回答