如何将含where子句的Haskell函数改写为Lambda表达式风格?
用Lambda表达式改写Haskell的generateAllSplits函数
你希望将带有where子句和辅助函数的Haskell函数改写成Lambda表达式风格,先看你的原始代码:
generateAllSplits :: Dataset -> [(Split, Dataset, Dataset)] generateAllSplits dataset = zipWith combfunc splits tuples where splits = getAllFeatureSplits dataset tuples = map (splitOnFeature dataset) splits combfunc :: Split -> (Dataset, Dataset) -> (Split, Dataset, Dataset) combfunc split (f,s) = (split,f,s)
以及你尝试的let版本:
generateAllSplits' :: Dataset -> [(Split, Dataset, Dataset)] generateAllSplits' dataset = let x = getAllFeatureSplits dataset y = map (splitOnFeature dataset) x in zip3 x (map fst y) (map snd y)
下面提供几种Lambda风格的改写方案:
方案1:用Lambda替代辅助函数combfunc
直接把combfunc的定义内联成匿名Lambda,保留where子句的结构,这是最直观的改写:
generateAllSplits :: Dataset -> [(Split, Dataset, Dataset)] generateAllSplits dataset = zipWith (\split (f,s) -> (split,f,s)) splits tuples where splits = getAllFeatureSplits dataset tuples = map (splitOnFeature dataset) splits
这里去掉了单独的combfunc函数,把它的逻辑直接写成zipWith的第二个参数,完全符合Lambda表达式风格。
方案2:内联where子句变量,进一步精简
如果想去掉where子句,可以把变量直接内联到表达式中,不过要注意可读性:
generateAllSplits :: Dataset -> [(Split, Dataset, Dataset)] generateAllSplits dataset = zipWith (\s (f,t) -> (s,f,t)) (getAllFeatureSplits dataset) (map (splitOnFeature dataset) (getAllFeatureSplits dataset))
这种写法完全没有额外的辅助定义,所有逻辑都在主表达式里,但重复调用了getAllFeatureSplits dataset,如果这个函数开销大,建议保留where子句来缓存结果。
方案3:用zip+map替代zipWith,Lambda解构更直观
另一种思路是先把splits和tuples配对,再用Lambda解构元组生成结果:
generateAllSplits :: Dataset -> [(Split, Dataset, Dataset)] generateAllSplits dataset = map (\(s, (f,t)) -> (s,f,t)) $ zip splits tuples where splits = getAllFeatureSplits dataset tuples = map (splitOnFeature dataset) splits
这种写法的逻辑更直白:先把拆分规则和对应的数据集拆分结果配对,再把每一对转换成三元组。
方案4:结合函数组合简化Lambda
如果想让Lambda更短,可以利用元组操作的组合,比如:
generateAllSplits :: Dataset -> [(Split, Dataset, Dataset)] generateAllSplits dataset = map (\(s, ft) -> (s, fst ft, snd ft)) $ zip splits tuples where splits = getAllFeatureSplits dataset tuples = map (splitOnFeature dataset) splits
这里把原来的模式解构换成了fst和snd调用,Lambda的写法更简洁。
内容的提问来源于stack exchange,提问作者Techtician
相关产品推荐
相关产品推荐

