我正在为即将到来的Haskell考试做准备,但是我不理解一道过去试卷上的问题。谷歌搜索没有有用的结果
fst(x, y) = x
square i = i * i
i)使用Haskell的惰性求值,简化以下表达式:
fst(square(3+4), square 8)
ii) 使用严格求值的方式减少源代码,使相同的表达式
iii) 惰性求值的优点和严格求值的优点各列举一个
我不明白的是什么是源代码减少?
我正在为即将到来的Haskell考试做准备,但是我不理解一道过去试卷上的问题。谷歌搜索没有有用的结果
fst(x, y) = x
square i = i * i
i)使用Haskell的惰性求值,简化以下表达式:
fst(square(3+4), square 8)
ii) 使用严格求值的方式减少源代码,使相同的表达式
iii) 惰性求值的优点和严格求值的优点各列举一个
我不明白的是什么是源代码减少?
归约是来自于Lambda演算的一个术语,它包括一种保留语义的转换,将一个术语替换为等价的术语。对于您提供的示例,最重要的归约类型为:
Beta归约是Lambda演算中的基本规则,在类似Haskell这样的纯惰性语言中,它始终保留语义。Beta规则是指:
(\x. e) m
可以用 e
替换,其中用 m
替换 x
。(替换必须避免在 m
中“捕获”自由的 x
实例。)square
应用程序可以按此方式缩减,并且有一个 fst
应用程序可以按此方式缩减。(+ 的应用程序也可以被缩减,但包括常量的缩减需要不同的规则。)从问题的结构来看,它可能仅意味着“手动计算表达式”,例如:
head (map primeTest (enumFromTo 1000 2000))
在惰性(仅在需要时计算)求值中,
head (map primeTest (enumFromTo 1000 2000))
= head (map primeTest (1000 : enumFromTo 1001 2000))
= head (primeTest 1000 : map primeTest (enumFromTo 1001 2000))
= primeTest 1000
= False
在严格(先评估所有内容)的评估中
head (map primeTest (enumFromTo 1000 2000))
= head (map primeTest (1000 : enumFromTo 1001 2000))
= ...
= head (map primeTest [1000, 1001, ..., 2000])
= head (primeTest 1000 : map primeTest [1001, 1002, ..., 2000])
= head (False : map primeTest [1001, 1002, ..., 2000])
= ...
= head [False, False, ..., False]
= False