Haskell 下面是4个功能相同但实现不同的函数。有人能提出更多不同的方法吗?

Haskell 下面是4个功能相同但实现不同的函数。有人能提出更多不同的方法吗?,haskell,Haskell,有4个函数具有相同的功能,但基于不同的方法有4个不同的实现,例如使用卫士、使用内联函数和where、使用表达式的大小写以及使用null::Foldable f=>fa->Bool和卫士。 我使用case of和where with patterns按功能做了两个相同的版本。 Willem Van Onsem又添加了一个版本,并修复了guard版本中的一个bug。非常感谢他。 有人可以使用不同的方法添加更多版本吗? 先谢谢你。 艾尔 您想要相同功能的更多版本吗?这里有无限多个,由模板Haskell

有4个函数具有相同的功能,但基于不同的方法有4个不同的实现,例如使用卫士、使用内联函数和where、使用表达式的大小写以及使用null::Foldable f=>fa->Bool和卫士。 我使用case of和where with patterns按功能做了两个相同的版本。 Willem Van Onsem又添加了一个版本,并修复了guard版本中的一个bug。非常感谢他。 有人可以使用不同的方法添加更多版本吗? 先谢谢你。 艾尔


您想要相同功能的更多版本吗?这里有无限多个,由模板Haskell方便地生成:

{-# LANGUAGE TemplateHaskell #-}

module MyListGenerator where

import Language.Haskell.TH

myListGenerator :: Int -> Q [Dec]
myListGenerator nTot = pure <$> go nTot (mkName "myList")
 where go 0 myName = return $ FunD myName
         [ Clause [ListP []] (NormalB . LitE $ StringL "empty") []
         , Clause [ListP [WildP]] (NormalB . LitE $ StringL "one") []
         , Clause [WildP] (NormalB . LitE $ StringL "more") []
         ]
       go n myName = do
         myArg <- newName "xs"
         locFunName <- newName "what"
         locDecl <- go (n-1) locFunName
         return $ FunD myName
           [ Clause [VarP myArg]
                    (NormalB $ AppE (VarE locFunName) (VarE myArg))
                    [locDecl]
           ]

谢谢你的回复。我不确定,我完全理解,但我的意思是,使用不同的方法,方法来编写相同的函数。这样我可以比较哈斯克尔的力量。到目前为止,我有4种不同类型的函数。可能是3.5.:。想法是看别人能看到什么,你看不到什么。我是哈斯凯尔的新手,试图从良好的意义上消化他人的专业知识。尤其是周围的人都很好很聪明。我会仔细研究你的方法。再次感谢。Al@Forestshield我认为这是一个开玩笑的回答,可能是为了强调很难精确定义不同的方法。不,这是一个严肃的问题。我在询问更多知识渊博的人的专业知识,他们是否可以通过使用我还不知道的东西来找到更多的方法。例如,Willem Van Onsem使用null::Foldable f=>f a->Bool来实现这个函数的方法对我来说是完全未知的。这就是全部。总之,有人结束了我的问题。我想,像这样寻求帮助是不合适的只是出于好奇。我编译并运行了你的应用程序,并在控制台中输出:1-exe;出口更多注销保存会话。。。复制共享历史。。。正在保存历史记录…正在截断历史记录文件。。。完整的。删除过期会话…3已完成。[流程完成]我不知道在哪里生成函数。无论如何有太多的东西,我无法理解从这个代码。无论如何谢谢。你能描述一下你问这个问题的动机吗?您希望更好地理解什么,或者您正在解决什么问题?有无限多个函数,这些函数具有相同的外部功能,而这些函数之间的差别很小。
{-# LANGUAGE TemplateHaskell #-}

module MyListGenerator where

import Language.Haskell.TH

myListGenerator :: Int -> Q [Dec]
myListGenerator nTot = pure <$> go nTot (mkName "myList")
 where go 0 myName = return $ FunD myName
         [ Clause [ListP []] (NormalB . LitE $ StringL "empty") []
         , Clause [ListP [WildP]] (NormalB . LitE $ StringL "one") []
         , Clause [WildP] (NormalB . LitE $ StringL "more") []
         ]
       go n myName = do
         myArg <- newName "xs"
         locFunName <- newName "what"
         locDecl <- go (n-1) locFunName
         return $ FunD myName
           [ Clause [VarP myArg]
                    (NormalB $ AppE (VarE locFunName) (VarE myArg))
                    [locDecl]
           ]
{-# LANGUAGE TemplateHaskell #-}

import MyListGenerator

myListGenerator 37

main = print $ myList "bla"