2013-08-29 1 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"] 

Я не могу определить экземпляр для класса typeclass сам, если я правильно понял, поскольку Fay не поддерживает классные классы (плюс, я думаю, если бы это было возможно, разработчики Fay сделали бы это для начала). Итак, есть ли обходной путь, или я должен делать JS FFI для сортировки строк?

EDIT: ответ от Ян Кристиансен кажется правильным: можно сортировать с помощью "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

Я не эксперт по fay, но Prelude из fay-base определяет пару экземпляров классов стандартного типа, например, экземпляр Eq для [a]. Однако он не определяет экземпляр Ord для [a]. Насколько я знаю, вы не можете определить экземпляр самостоятельно. Поэтому вам, вероятно, придется обратиться к sortBy, который принимает дополнительную функцию в качестве аргумента. Эта функция используется для сравнения двух элементов списка, т. Е. В вашем случае эта функция используется для сравнения двух строк. Вы должны предоставить эту функцию самостоятельно, но по крайней мере вам не нужно использовать javascript FFI.

1

Рассмотрите возможность использования Fay.Text, если вы включите OverloadedStrings и RebindableSyntax в файл Fay заменят строковые литералы строки JS, они могут иметь экземпляр Ord (но похоже, я забыл добавить его! Заплату его или не использовать StandaloneDeriving, пока я обойти его). Как Data.Text, они более эффективны, и они также менее проблематичны при использовании FFI.

Кроме того, у нас, вероятно, будет поддержка экземпляров Eq и Ord в ближайшее время, среди других типов.