通过什么机制这个斐波那契函数被记忆了?
fib = (map fib' [0..] !!)
where fib' 1 = 1
fib' 2 = 1
fib' n = fib (n-2) + fib (n-1)
Run Code Online (Sandbox Code Playgroud)
在相关的说明中,为什么这个版本不是?
fib n = (map fib' [0..] !! n)
where fib' 1 = 1
fib' 2 = 1
fib' n = fib (n-2) + fib (n-1)
Run Code Online (Sandbox Code Playgroud) 我最近注意到的一个短语是"无点"风格的概念......
然后,我在这里发现他们提到"另一个可能值得讨论的话题是作者不喜欢点自由风格."
什么是"免费"风格?有人可以给出简明的解释吗?它与"自动"曲线有关吗?
为了了解我的水平 - 我一直在教自己Scheme,并编写了一个简单的Scheme解释器...我理解"隐含"currying是什么,但我不知道任何Haskell或ML.
我知道在某些语言(Haskell?)中,努力是实现无点样式,或者永远不要通过名称显式引用函数参数.这对我来说是一个非常难以掌握的概念,但它可以帮助我理解这种风格的优点(或者甚至是缺点).谁能解释一下?
我已经看到很多函数是根据模式定义的(f .) . g.例如:
countWhere = (length .) . filter
duplicate = (concat .) . replicate
concatMap = (concat .) . map
Run Code Online (Sandbox Code Playgroud)
这是什么意思?
haskell functional-programming pointfree function-composition tacit-programming
我刚写了以下两个函数:
fand :: (a -> Bool) -> (a -> Bool) -> a -> Bool
fand f1 f2 x = (f1 x) && (f2 x)
f_or :: (a -> Bool) -> (a -> Bool) -> a -> Bool
f_or f1 f2 x = (f1 x) || (f2 x)
Run Code Online (Sandbox Code Playgroud)
它们可能用于组合两个布尔函数的值,例如:
import Text.ParserCombinators.Parsec
import Data.Char
nameChar = satisfy (isLetter `f_or` isDigit)
Run Code Online (Sandbox Code Playgroud)
看了这两个函数后,我意识到它们非常有用.以至于我现在怀疑它们是否包含在标准库中,或者更可能是使用现有函数有一种干净的方法来执行此操作.
这样做的"正确"方法是什么?
普通的功能组成属于这种类型
(.) :: (b -> c) -> (a -> b) -> a -> c
Run Code Online (Sandbox Code Playgroud)
我认为这应该概括为类型:
(.) :: (c -> d) -> (a -> b -> c) -> a -> b -> d
Run Code Online (Sandbox Code Playgroud)
一个具体的例子:计算差分平方.我们可以写diffsq a b = (a - b) ^ 2,但感觉我应该能够编写(-)和(^2)编写类似的东西diffsq = (^2) . (-).
当然,我不能.我可以做的一件事是使用一个元组而不是两个参数(-),通过转换它uncurry,但这不一样.
有可能做我想要的吗?如果没有,我误解的是什么让我认为它应该是可能的?
注意:这里已经有效地提出过这个问题,但是没有给出答案(我怀疑必须存在).
在不同的问题上,我发现了关于使用(->)Monads实例的评论中的提示,例如用于实现无点样式.
至于我,这有点过于抽象.好吧,我已经看到了Arrow实例,在(->)我看来,它(->)可以在实例表示法中使用,但不能在类型声明中使用(这可能只是另一个问题的东西).
有没有任何例子使用(->)Monad的例子?还是一个很好的链接?
很抱歉,如果这个问题可能已经在这里讨论过,但是搜索" (->)Monad实例"会给你很多次点击,因为你可以想象......因为几乎所有关于Haskell的问题都涉及到(->)"Monad".
我想要一个一致的库,使我能够轻松地做这些技巧,专注于高级功能概念(仿函数,幺半群,monad,镜头等),不会放弃开发.
现在最好的选择是什么?
我相信我对fmap . fmapFunctors 了解,但是在功能方面它已经让我头疼了好几个月了.
我已经看到你可以只应用(.)to 的定义(.) . (.),但我忘了怎么做.
当我自己尝试时,它总是错误的:
(.) f g = \x -> f (g x)
(.) (.) (.) = \x -> (.) ((.) x)
\x f -> (.) ((.) x) f
\x f y -> (((.)(f y)) x)
\x f y g-> (((.)(f y) g) x)
\x f y g-> ((f (g y)) x)
\x f y g-> ((f (g y)) x):: t2 -> (t1 -> t2 -> t) -> t3 …Run Code Online (Sandbox Code Playgroud) 我找到了以下定义
(%) = flip fmap
Run Code Online (Sandbox Code Playgroud)
我可以编写如下代码:
readFile "/etc/passwd" % lines % filter (not . null)
Run Code Online (Sandbox Code Playgroud)
对我而言,替代方案更有意义
filter (not . null) <$> lines <$> readFile "/etc/passwd"
Run Code Online (Sandbox Code Playgroud)
显然它只是一个有序的问题,是否还有其他人这样做?是否有正当理由不写这样的代码?
pointfree ×10
haskell ×7
coding-style ×1
combinators ×1
f# ×1
fibonacci ×1
javascript ×1
memoization ×1
monads ×1
scheme ×1