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