首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >辅助函数在Haskell中定义实例时,如何分组?

辅助函数在Haskell中定义实例时,如何分组?
EN

Stack Overflow用户
提问于 2016-01-30 15:33:51
回答 1查看 305关注 0票数 0
代码语言:javascript
运行
复制
instance Num Polinom where
    let
        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 *) 

    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]

因此,这段代码可以工作,但是是否有一种方法可以生成一组辅助函数,这样我就不必在每次定义之后编写它们。

如下所示:

代码语言:javascript
运行
复制
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]
        where
            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 *) 
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-01-30 19:51:00

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

代码语言:javascript
运行
复制
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]

如果希望将其保持在模块的私有位置,只需使用导出列表避免导出它们:

代码语言:javascript
运行
复制
module MyModule(funcA, funcB, funcC) where
...

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35103559

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档