- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
>>>flip fix (0 :: Int) (\a b -> putStrLn "abc")
Output: "abc"
这是使用翻转修复
的简化版本。
我在一些 YouTube 视频中看到了这种使用方式,这些视频可能来自谷歌技术演讲或其他一些演讲。
有人能给我一些指示(不是一些内存地址,谢谢!)fix
到底是什么。我从官方网站上的文档中知道了一般定义。而且我在网上查了很多资料,就是找不到全面且简单易懂的答案。
而翻转修复
对我来说就像一个谜。在该特定函数调用中实际发生了什么?
顺便说一句,我大约两个月前才选择 Haskell。而且我数学不太好:(
<小时/>这是完整的代码,由进行该演示的人共享,如果有人感兴趣的话:
(哦,这是解释游戏 mastermind
Click 的 wiki 链接)
module Mastermind where
import Control.Monad
import Data.Function
import Data.List
import System.Random
data Score = Score
{ scoreRightPos :: Int
, scoreWrongPos :: Int
}
deriving (Eq, Show)
instance Read Score where
readsPrec _ r = [ (Score rp wp, t)
| (rp, s) <- readsPrec 11 r
, (wp, t) <- readsPrec 11 s
]
calcScore :: (Eq a) => [a] -> [a] -> Score
calcScore secret guess = Score rightPos wrongPos
where
rightPos = length [() | (a, b) <- zip secret guess, a == b]
wrongPos = length secret - length wrongTokens - rightPos
wrongTokens = guess \\ secret
pool :: String
pool = "rgbywo"
universe :: [String]
universe = perms 4 pool
perms :: Int -> [a] -> [[a]]
perms n p = [s' | s <- subsequences p, length s == n, s' <- permutations s]
chooseSecret :: IO String
chooseSecret = do
i <- randomRIO (0, length universe - 1)
return $ universe !! i
guessSecret :: [Score] -> [String]-> [String]
guessSecret _ [] = []
guessSecret ~(s:h) (g:u) = g : guessSecret h [g' | g' <- u, calcScore g' g == s]
playSecreter :: IO ()
playSecreter = do
secret <- chooseSecret
flip fix (0 :: Int) $ \loop numGuesses -> do
putStr "Guess: "
guess <- getLine
let
score = calcScore secret guess
numGuesses' = numGuesses + 1
print score
case scoreRightPos score of
4 -> putStrLn $ "Well done, you guessed in " ++ show numGuesses'
_ -> loop numGuesses'
playBoth :: IO ()
playBoth = do
secret <- chooseSecret
let
guesses = guessSecret scores universe
scores = map (calcScore secret) guesses
history = zip guesses scores
forM_ history $ \(guess, score) -> do
putStr "Guess: "
putStrLn guess
print score
putStrLn $ "Well done, you guessed in " ++ show (length history)
playGuesser :: IO ()
playGuesser = do
input <- getContents
let
guesses = guessSecret scores universe
scores = map read $ lines input
history = zip guesses scores
forM_ guesses $ \guess -> do
putStrLn guess
putStr "Score: "
case snd $ last history of
Score 4 0 -> putStrLn $ "Well done me, I guessed in " ++ show (length history)
_ -> putStrLn "Cheat!"
最佳答案
修复
是fixed-point operator 。正如您可能从它的定义中知道的那样,它计算函数的不动点。这意味着,对于给定函数 f
,它会搜索值 x
,使得 f x == x
。
我们可以将x
视为无限项f (f (f ... ) ...))
的结果。显然,由于它是无限的,所以在它前面添加 f
不会改变它,因此 f x
将与 x
相同。当然,我们不能表达无限项,但是我们可以将fix
定义为fix f = f (fix f)
,它表达了这个想法。
它会终止吗?是的,会的,但只是因为 Haskell 是一种懒惰的语言。如果 f
不需要它的参数,它不会计算它,因此计算将终止,它不会永远循环。如果我们在一个始终使用其参数(严格的)的函数上调用 fix
,它永远不会终止。所以有些函数有不动点,有些则没有。 Haskell 的惰性求值确保我们计算它(如果存在)。
fix
有用?表示递归。任何递归函数都可以使用fix
来表达,而不需要任何额外的递归。所以fix
是一个非常强大的工具!假设我们有
fact :: Int -> Int
fact 0 = 1
fact n = n * fact (n - 1)
我们可以使用fix
消除递归,如下所示:
fact :: Int -> Int
fact = fix fact'
where
fact' :: (Int -> Int) -> Int -> Int
fact' _ 0 = 1
fact' r n = n * r (n - 1)
这里,fact'
不是递归的。递归已移至 fix
中。这个想法是,fact'
接受一个函数作为其第一个参数,如果需要的话,它将用于递归调用。如果您使用 fix
的定义扩展 fix fact'
,您会发现它与原始 fact
的作用相同。
因此,您可以拥有一种仅具有原始 fix
运算符的语言,否则不允许任何递归定义,并且您可以使用递归定义来表达您可以表达的一切。
让我们看看flip fix (0::Int) (\a b -> putStrLn "abc")
,它只是fix (\a b -> putStrLn "abc") (0::Int)
。现在我们来评估一下:
fix (\a b -> putStrLn "abc") =
(\a b -> putStrLn "abc") (fix (\a b -> putStrLn "abc")) =
\b -> putStrLn "abc"
因此,整个表达式的计算结果为 (\b -> putStrLn "abc") (0::Int)
,即 putStrLn "abc"
。因为函数 \a b -> putStrLn "abc"
忽略其第一个参数,所以 fix
永远不会递归。它实际上在这里只是用来混淆代码。
关于haskell - 翻转修复/修复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15523093/
我将一个 div 设置为 100% 宽度,当以 1024 分辨率查看页面时,宽度应从 100% 变为 1000px,我让它与@media 查询一起正常工作,并且在 FF、safari chrome 上
希望有人能帮助我,我已经被困了几天了。 将我的 Domino 服务器更新到 9.01 Fix 3 后,我在 javascript 控制台上不断收到错误消息: TypeError: this.edito
我们正在使用一个基于RMI的java应用程序。当我们运行应用程序时,即使应用程序处于理想阶段,内存使用量仍然不断增加。我们主要使用Vector和散列图数据结构。如何最大限度地减少java内存使用/修复
概述 Internet Download Manager (IDM)是最流行的 Windows 下载管理器。如果你平时工作中使用过IDM,您会惊叹 IDM 下载文件的速度有多快。IDM
当我打开 brave 浏览器时,会打开一个窗口(如下所示)。它并没有真正干扰浏览器的处理。但令人担忧的是为什么这种情况一直发生...... Error On Opening Brave Browser
这是我今天在求职面试中被问到的一个问题: 看下面的代码: int n=20; for (int i =0; i
我不小心删除了/opt/local/bin/perl5.8.9 ,这似乎是 macports 编译的 perl 的主要二进制文件。 现在我有很多取决于 perl5 的端口,但不想卸载并重新安装所有端口
>>>flip fix (0 :: Int) (\a b -> putStrLn "abc") Output: "abc" 这是使用翻转修复的简化版本。 我在一些 YouTube 视频中看到了这种使用
这个问题已经有答案了: How can I fix 'android.os.NetworkOnMainThreadException'? (64 个回答) 已关闭 3 年前。 我在 Android 应
def main(): cash = float(input("How much money: ")) coins = 0 def changeCounter(n): whil
前一周我遇到了类似的问题,查询需要永远运行。在编写此查询时,我尝试应用从其他查询中学到的一些知识,但执行起来需要很长时间。 运行查询的两个单独部分时,每个部分需要 2 分钟才能完成,这是可以接受的,但
下午,我的 CSS 有问题。第三个下拉菜单放错了,我没有解决办法。 这是我想要的: 之前: http://i53.tinypic.com/2qu85z8.png 之后: http://i51.tiny
更新方法: override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingS
我知道这是一个很多人都遇到过的问题,但我不熟悉 Less 并且是 Bootstrap 的新手,我正在寻找一种全 CSS 解决方案来防止我的导航栏折叠到 768 像素以下:
在我的布局中,我创建了以下 jsfiddle 托管的可调整大小的粘性页脚。但是,在调整大小时它与内容重叠。有没有办法让它在所有浏览器上都能响应? http://jsfiddle.net/9aLc0mg
我想要实现的目标 racer-offset 是为了让用户可以设置图像可以以 px 为单位移动多远。偏移量管理偏移量。 Speed-racer 告诉我们图像在滚动过程中移动的速度。我的问题是它不会停止。
我有一个简单的自动换行函数,它接受一个长字符串作为输入,然后将该字符串分成更小的字符串,并将它们添加到一个数组中,以便稍后输出。现在最后一两个字没有输出。这是主要问题。但是,我还想改进功能。我知道这有
我试图在使用每个 slider 之前禁用“下一步”按钮,我不确定为什么在单击不再是 class="not-clicked"的同一个 slider 时取消禁用该按钮. JSFiddle: (这里看起来有
这个问题已经有答案了: What is a NullPointerException, and how do I fix it? (12 个回答) 已关闭 8 年前。 如何让程序输出所有信息? IT
On this page ,在“生活”下有一个带有自动生成的子菜单的菜单。子菜单存在一些问题(它会闪烁并改变大小——如果你滚动它就会看到)。我需要以某种方式覆盖它当前正在读取的 css 并使其统一。
我是一名优秀的程序员,十分优秀!