在Haskell中定义实例时的辅助功能,如何分组?

时间:2016-01-30 15:33:52

标签: haskell

Document doc = Jsoup.parse(input, "UTF-8", "http://example.com/");

Elements links = doc.select("a[href]"); // a with href

所以这段代码有效,但是有没有办法制作一组辅助函数,所以我不必在每个定义之后编写它们。

像这样:

 FileUtils.copyURLToFile(URL source, File destination);

1 个答案:

答案 0 :(得分:2)

没有。 letwhere只能在设计中用于一个表达式或声明中。如果要将它们用作多个声明的辅助函数,只需将它们放在顶层:

zmnoziKoef :: [Rational] -> [Rational] -> [Rational]
zmnoziKoef _ [] = []
zmnoziKoef [] _ = []
zmnoziKoef (x:xs) (y:ys) = (x * y) : pomnoziKoef x ys `sestejKoef` (xs `zmnoziKoef` (y:ys))

sestejKoef :: [Rational] -> [Rational] -> [Rational]
sestejKoef xs [] = xs
sestejKoef [] ys = ys

sestejKoef (x:xs) (y:ys) = (x + y):(sestejKoef xs ys)

pomnoziKoef :: Rational -> [Rational] -> [Rational]
pomnoziKoef a = map (a *) 

instance Num Polinom where
    negate (Polinom koef) = Polinom $ pomnoziKoef (-1) koef
    (Polinom koef1) + (Polinom koef2) = Polinom $ sestejKoef koef1 koef2
    (Polinom koef1) * (Polinom koef2) = Polinom $ zmnoziKoef koef1 koef2
    fromInteger x = Polinom $ [fromInteger x]

如果您希望将此模块保密,您可以使用导出列表避免导出它们:

module MyModule(funcA, funcB, funcC) where
...

在上面的代码中,只导出funcA,导出模块时会导出funcBfuncC(加上所有实例)。