- 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/
我有一个数据集,我试图在其中探索将变量限制在给定值并将超出的部分滚动到后续间隔的影响。我可以从概念上看到一些方法可以使用 cumsum() 来做到这一点。或类似的,但正在努力了解如何以合乎逻辑的方式实
我正在开发一个使用 iPhone 前置摄像头的应用程序。当使用该相机拍摄图像时,iPhone 会水平扭曲图像。我想将其镜像回来,以便能够保存它并按照在 iPhone 屏幕上看到的方式显示它。 我读了很
这是 HTML // stuff here Order /
我正在使用 Jquery - 是否有一种简单的方法可以在用户滑过 div 时更改它的背景颜色? 最佳答案 你可以用 CSS 做到这一点: #myDiv:hover { background-color
有谁知道是否可以翻转图像并在其背面显示内容。这就是我的意思:想象一下你手里拿着一张肖像。然后你翻转并查看肖像的背面,背面有文字。我正在寻找类似的东西,单击图像将镜像/翻转到另一侧,上面有文字。不可90
我在翻车方面遇到了一些麻烦..希望你能帮助我! 我正在使用 li 导航,我希望有单独的框链接到不同的页面。这部分很好,可以正常工作。我希望能够将鼠标悬停在框上并让框和链接改变颜色。我可以毫无问题地改变
所以我目前在 Vuejs 中有一个组件,用户可以在其中从他们的本地文件系统中选择一个文件。用户选择图片后,图片会在 div 中预览 codesandbox .出于某种原因,某些图像会自动“翻转”到侧面
我有一个滚动顶部菜单。我正在尝试获取它,以便我的背景图像 (17px x 13px) 悬停在中央。我已经尝试了所有背景 css 属性,但似乎没有任何效果。我是不是用错了方法? 这是我的 CSS: #n
我以前用过这个效果,一切正常(据我所知),但就是不行。我错过了什么? Fiddle here Sprite here 谢谢。 最佳答案 由于您的 Sprite 是水平排列的,因此您需要像这样偏移悬停状
代码后面的代码不起作用,因为重新查找接受字符串作为第一个参数,正则表达式作为第二个参数。 (-> "hello" .toUpperCase (re-find #".$")) 如果我像这
我想使用 CABasicAnimation 翻转 UILabel。动画将永远重复,并将在两个不同值之间更改 UILabel 的文本。 - (void)animateLabel { [self
旋转 WPF 图像非常简单 imgCurrent.LayoutTransform = new RotateTransform(_rotationAngle); 水平和垂直镜像呢? 机外: In GDI
我需要创建一个动画 - 翻转一个 View 并显示另一个。 当前显示的 View 的宽度慢慢减小到零,之后要显示的 View 的宽度必须从零开始增加。 在此期间,高度从当前显示的高度变为略微降低的高度
我正在尝试找到翻转 Rust 中 boolean 值的最快方法?即 false => true true => false 对于我的应用程序,我不关心 boolean 值的当前值,只关心它被翻转了。对
是否可以翻转 primefaces 中的数据表,以使标题位于左侧而不是顶部?我有下表: 如您所见
我在翻转 View 时遇到了一些问题。我的 View Controller 中有以下代码: - (void)loadFlipsideViewController { ProblemViewFl
我正在使用翻转动画在 View Controller 中的两个 View 之间制作动画。问题是动画发生时背景显示白色空白背景。我想显示黑色背景。 我尝试在 IB 和代码中将主视图的背景颜色设置为黑色。
请考虑下面的代码,并告诉我我做错了什么。 我想在两个 UIView 之间切换。 不知何故,当我从初始 View 翻转时,我只是得到翻转的 View ,没有动画。当我向后翻转时,动画显示得很好。 翻转是
我有一个 NSScrollView,需要在其中显示可变数量的 NSView。我制作了一个自定义 NSView,它的 isFlipped 返回 YES 并将我的 NSView 放入其中,然后将其设置为
我有一个 NSView 的子类,它重新实现了许多鼠标事件函数。例如,在 mouseDown 中从我使用的 NSEvent 获取点: NSEvent *theEvent; // <- argument
我是一名优秀的程序员,十分优秀!