作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如果在命令式语言中失败,Haskell 等效模式是什么,例如:
function f (arg, result) {
if (arg % 2 == 0) {
result += "a"
}
if (arg % 3 == 0) {
result += "b"
}
if (arg % 5 == 0) {
result += "c"
}
return result
}
最佳答案
而不是使用 State
monad,你也可以使用 Writer
monad 并利用 String
的Monoid
实例(真正的 [a]
的 Monoid
实例):
import Control.Monad.Writer
f :: Int -> String -> String
f arg result = execWriter $ do
tell result
when (arg `mod` 2 == 0) $ tell "a"
when (arg `mod` 3 == 0) $ tell "b"
when (arg `mod` 5 == 0) $ tell "c"
State
相比,它有一个优势。 monad 是您可以通过重新排列行来重新排列发生连接的顺序。例如,如果你想运行
f 30 "test"
离开
"atestbc"
,您所要做的就是交换
do
的前两行:
f arg result = execWriter $ do
when (arg `mod` 2 == 0) $ tell "a"
tell result
when (arg `mod` 3 == 0) $ tell "b"
when (arg `mod` 5 == 0) $ tell "c"
State
monad 你必须改变操作:
f arg = execState $ do
when (arg `mod` 2 == 0) $ modify ("a" ++)
when (arg `mod` 3 == 0) $ modify (++ "b")
when (arg `mod` 5 == 0) $ modify (++ "c")
(++ "a")
和
("a" ++)
之间存在细微差别),而不是在输出字符串中的执行顺序和顺序之间存在关系,而
Writer
在我看来,代码乍一看非常清楚。
Strings
上进行串联不是很快,但你可以很容易地使用
Text
和
Builder
解决这个问题:
{-# LANGUAGE OverloadedStrings #-}
import Data.Text.Lazy (Text)
import qualified Data.Text.Lazy as T
import qualified Data.Text.Lazy.Builder as B
import Control.Monad.Writer
f :: Int -> Text -> Text
f arg result = B.toLazyText . execWriter $ do
tellText result
when (arg `mod` 2 == 0) $ tellText "a"
when (arg `mod` 3 == 0) $ tellText "b"
when (arg `mod` 5 == 0) $ tellText "c"
where tellText = tell . B.fromLazyText
关于haskell - 如果跌倒,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23430994/
谁能告诉我是否可以使用 jquery statusCode 将一个状态代码切换到下一个状态代码,以便一个响应可以处理 2 个状态代码?下面的代码有一个错误,但它显示了我想要实现的目标...400 下降
我是一名优秀的程序员,十分优秀!