作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我试图理解纯函数式语言的执行顺序。
我知道在纯函数式语言中,没有必要的执行顺序。
所以我的问题是:
假设有两个函数。
我想知道我可以一个接一个地调用一个函数的所有方式(除了从另一个函数嵌套调用)(除了 io-mode)。
我想查看 Haskell 或伪代码中的示例。
最佳答案
如果函数完全独立并且在调用另一个函数时不使用其中一个的结果,则无法执行您所描述的操作。
这是因为没有理由这样做。在无副作用的设置中,调用一个函数然后忽略其结果与在调用该函数所需的时间内不做任何事情完全相同(留出内存使用量)。
可能是 seq x y
将评估 x
然后 y
,然后给你y
作为其结果,但不保证此评估顺序。
现在,如果我们确实有副作用,例如如果我们在 Monad 或 Applicative 中工作,这可能很有用,但我们并没有真正忽略结果,因为隐式传递了上下文。例如,你可以做
main :: IO ()
main = putStrLn "Hello, " >> putStrLn "world"
biggerThanTen :: Int -> Bool
biggerThanTen n = n > 10
example :: String
example = filter biggerThanTen [1..15] >> return 'a' -- This evaluates to "aaaaa"
filter biggerThanTen [1..15]
的结果列表具有 5 个元素的事实)。
example2 :: [Int]
example2 =
[1,2,3] >>=
(\x -> [10,100,1000] >>=
(\y -> return (x * y))) -- ==> [10,100,1000,20,200,2000,30,300,3000]
>>=
和
>>
(实际上还涉及另一件事来处理模式匹配失败,但这与手头的讨论无关)。编译器实际上采用 do 表示法编写的内容并将它们转换为
>>=
和
>>
通过一个称为“脱糖”的过程(因为它去除了语法糖)。以下是上面用 do 符号编写的三个示例:
main :: IO ()
main = do
putStrLn "Hello, "
putStrLn "World"
biggerThanTen :: Int -> Bool
biggerThanTen n = n > 10
example :: String -- String is a synonym for [Char], by the way
example = do
filter biggerThanTen [1..15]
return 'a'
example2 :: [Int]
example2 = do
x <- [1,2,3]
y <- [10,100,1000]
return (x * y)
do --
m -- m >> n
n --
do --
x <- m -- m >>= (\x ->
... -- ...)
>>=
和
return
因为,正如我所说,这就是编译器将 do 符号转换成的内容。
>>
与
>>=
相同,它只是忽略了它的左参数的“结果”(尽管它保留了“上下文”或“结构”)。所以
>>
的所有定义必须等于
m >> n = m >>= (\_ -> n)
.
>>=
在第二个列表示例中
>>=
在第二个列表示例中调用,使用列表的 Monad 定义。定义是:
instance Monad [] where
return x = [x]
xs >>= f = concatMap f xs
example2
进入:
example2 :: [Int]
example2 =
[1,2,3] >>=
(\x -> [10,100,1000] >>=
(\y -> return (x * y)))
>>=
)
example2 =
concatMap
(\x -> [10,100,1000] >>=
(\y -> return (x * y)))
[1,2,3]
example2 =
concatMap
(\x -> concatMap
(\y -> return (x * y))
[10,100,1000])
[1,2,3]
example2 =
concatMap
(\x -> concatMap
(\y -> [x * y])
[10,100,1000])
[1,2,3]
关于haskell - 有没有办法在纯函数式语言中调用两个函数(一个接一个)? (在非 io 模式下),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22964750/
我是一名优秀的程序员,十分优秀!