无点风格并使用$

Fre*_*rik 10 haskell pointfree

如何结合使用$和无点风格?

一个明显的例子是以下效用函数:

times :: Int -> [a] -> [a]
times n xs = concat $ replicate n xs  
Run Code Online (Sandbox Code Playgroud)

只是写入concat $ replicate产生错误,类似的是你不能写concat . replicate,因为concat期望值而不是函数.

那么你如何将上述功能转变为无点风格呢?

fuz*_*fuz 22

你可以使用这个组合器:(冒号提示两个参数如下)

(.:) :: (c -> d) -> (a -> b -> c) -> a -> b -> d
(.:) = (.) . (.)
Run Code Online (Sandbox Code Playgroud)

它可以让你摆脱n:

time = concat .: replicate
Run Code Online (Sandbox Code Playgroud)

  • 我个人更喜欢`.*`,以便下一个可以是`.**`,`.***`等.无论哪种方式,我们都应该尝试将`.:`放入Haskell Prime的Prelude中,或者至少进入基础库. (3认同)

Fre*_*Foo 13

您可以轻松地编写几乎无点的版本

times n  =  concat . replicate n
Run Code Online (Sandbox Code Playgroud)

一个完全无点的版本可以通过明确的咖喱和不连续来实现:

times  =  curry $ concat . uncurry replicate
Run Code Online (Sandbox Code Playgroud)

  • 几乎无点版本的另一个+1.虽然我建议更广泛地采用`.:`,但我也建议坚持使用"几乎"无点的更复杂的案例. (3认同)
  • @Dan嗯,完全无点通常被认为是无意义的,至少我是这样. (3认同)

Jos*_*Lee 12

上freenode并问lambdabot;)

<jleedev> @pl \n xs -> concat $ replicate n xs
<lambdabot> (join .) . replicate
Run Code Online (Sandbox Code Playgroud)