我正在尝试扩展一个简单的斐波那契函数,我需要多次使用每个项的值.所以,我想我会let用来保持价值观.但是,我没有得到我认为我应该从功能中得到的东西.
这是原始fib功能:
(define (fib n)
(if (< n 2)
n
(+ (fib (- n 1)) (fib (- n 2)))))
Run Code Online (Sandbox Code Playgroud)
这是我尝试做同样的事情,但是let:
(define (fib-with-let n)
(if (< n 2)
0
(let ((f1 (fib-with-let (- n 1)))
(f2 (fib-with-let (- n 2))))
(+ f1 f2))))
Run Code Online (Sandbox Code Playgroud)
结果:
> (fib 10)
55
> (fib-with-let 10)
0
Run Code Online (Sandbox Code Playgroud)
谢谢!
我正在学习haskell,目前正在尝试从字符串中解析Integers和Floats.
但是,当我在"342"或任何没有单个或多个非数字字符的"数字"上尝试我的readNum函数时,ghci向我报告:
*异常:parse.hs:125:18-46:模式的无可辩驳模式失败(i,(a:as))
data Token
= IntTok Int | FloatTok Float | EOF
readNum :: String->(Token, String)
readNum [] = (EOF, [])
readNum xs = let (i, (a:as)) = span isDigit xs --This is line 125
in (case a of
('.') -> let (j, (b:c:bs)) = span isDigit as
in (if ((toLower b) == 'e' && (c == '+' || c == '-' || (isDigit c)))
then (let (k, d) = span isDigit bs in (FloatTok (read (concat [i,[a],j, …Run Code Online (Sandbox Code Playgroud) 我有多个使用相同LET变量的LINQ查询,我想以某种方式预定义这些.
IQueryable<RouteQueryModel> query =
(from b in db.routes
let avg_rating = b.ratings.Any() ?
b.ratings.Select(r => r.rating1).Average() :
0
let distance_to_first_from_me = b.coordinates.
Select(c => c.position).
FirstOrDefault().
Distance(DbGeography.FromText(currentLocation, 4326))
let distance_to_last_from_me = b.coordinates.
OrderByDescending(c => c.sequence).
Select(d => d.position).
FirstOrDefault().
Distance(DbGeography.FromText(currentLocation, 4326))
let distance_to_from_me = distance_to_first_from_me < distance_to_last_from_me ?
distance_to_first_from_me :
distance_to_last_from_me
where b.endpoints.Any(e => values.Any(t => t == e.town.town_id))
select new RouteQueryModel
{
b = b,
distance_to_from_me = distance_to_from_me.Value,
avg_rating = avg_rating
}
);
Run Code Online (Sandbox Code Playgroud)
我在8个不同的查询中使用了这三个distance_to LET,有没有办法为那些我可以在查询中使用的模板制作模板?
我一直在寻找一段时间,我找不到合适的问题,所以我会发布它.我希望不会发布.
我明白了什么!并且让做,但我不明白为什么设置!可以修改let的局部变量并永远保持该值.例如:
(define count
(let ((cont 0))
(lambda ()
(set! cont (+ cont 1))
cont)))
Run Code Online (Sandbox Code Playgroud)
如果我们多次评估(计数),我们会看到结果是
> (count)
1
> (count)
2
> (count)
3
>
Run Code Online (Sandbox Code Playgroud)
... 等等.但是,据我所知,cont是一个局部变量,为什么它保持价值呢?为什么每次调用函数时都没有设置为0?
好吧,那就是:)先谢谢!
PS:请原谅我的英语*o*
我是哈斯凯尔的新手,我正在努力学习哈斯克尔.我试图以最可能的方式创建像"复制"这样的简单函数.我已经完成了"复制"模式匹配和警卫.我无法让它在列表理解中使用.我可以想象让列表理解不理想,但我更感兴趣为什么它不起作用=].
我的问题是:为什么复制'产生[Int]和复制''产生[[Int]],甚至可以用列表理解中的let生成[Int]?
感谢您的时间和帮助:).
--list comprehension
duplicate' xs = [y | x <- xs, y <- [x,x]]
input => [1,2,3,4]
output => [1,1,2,2,3,3,4,4]
expected? => yes
--list comprehension with let
duplicate'' xs = [y | x <- xs, let y = [x,x]]
input => [1,2,3,4]
output => [[1,1],[2,2],[3,3],[4,4]]
expected? => yes
Run Code Online (Sandbox Code Playgroud) 我正在写一个与此类似的函数:
f x = let
x = ...
in
e
Run Code Online (Sandbox Code Playgroud)
由于Haskell中的作用域规则,在e中使用x将解析let构造中x的定义.
为什么在Haskell中允许这样的事情?编译器不应该拒绝这样的程序,告诉我们不能绑定与函数参数同名的值.
(这个例子可能过于简单,但在现实世界中,变量具有与之相关的语义含义,很容易犯这样的错误)
让我们说我们有这个功能:
foo n = let comp n = n * n * n + 10
otherComp n = (comp n) + (comp n)
in (otherComp n) + (otherComp n)
Run Code Online (Sandbox Code Playgroud)
comp实际执行了多少次?1还是4?Haskell"存储"函数是否导致let的范围?
我正在阅读Graham Hutton的"伟大"书的第2版"Haskell的Progamming"(剑桥出版社).
阅读State Monad部分,我偶然发现了一个我给自己做的小任务.
你怎么能用where而不是重写以下内容let?
type State = Int
newtype ST a = S (State -> (a, State))
instance Functor ST where
-- fmap :: (a -> b) -> ST a -> ST b
fmap g st = S (\state -> let (x, s') = app st state in (g x, s'))
Run Code Online (Sandbox Code Playgroud)
我试过这个代码的变体,但它不起作用:
instance Functor ST where
-- fmap :: (a -> b) -> ST a -> ST b
fmap g st …Run Code Online (Sandbox Code Playgroud) 我正在练习评估let表达式的练习问题,但我不理解该表达式的输出。
这是表达式:
let a = 2
b = 1:[i * 2 | i <- b]
f a = 1:[i * a | i <- (f a)]
in take (a+2) (f (head (tail b) ))
Run Code Online (Sandbox Code Playgroud)
输出应该是[1,2,4,8]。有人可以一步一步解释为什么这是输出
我在Haskell GHCi中写一个简单的声明
myPi = 3.14
Run Code Online (Sandbox Code Playgroud)
我也可以这样写
let myPi = 3.14
Run Code Online (Sandbox Code Playgroud)
这两个声明之间的这个非常简单的示例有什么区别?我知道let的额外功能,但这里不需要