作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我是 Haskell 的初学者,我正在努力掌握它。
我遇到以下问题:
我有一个获取 5 个参数的函数,可以说
f x y w z a = x - y - w - z - a
x
来自
1
至
10
而
y
,
w
,
z
和
a
将永远是一样的。我实现的实现如下,但我认为必须有更好的方法。
x from 1 to 10
y = 1
w = 2
z = 3
a = 4
map ($ 4) $ map ($ 3) $ map ($ 2) $ map ($ 1) (map f [1..10])
最佳答案
到目前为止所有的建议都很好。这是另一个,起初可能看起来有点奇怪,但在许多其他情况下却非常方便。
一些类型形成运算符,如 []
,它是映射一种元素类型的运算符,例如Int
这些元素的列表类型,[Int]
, 具有 Applicative
的属性.对于列表,这意味着有某种方式,由运算符 <*>
表示,发音为“应用”,将函数列表和参数列表转换为结果列表。
(<*>) :: [s -> t] -> [s] -> [t] -- one instance of the general type of <*>
$
给出
($) :: (s -> t) -> s -> t
pure :: x -> [x] -- again, one instance of the general scheme
<*>
兼容.那是
pure
将普通值移动到应用习语中。
pure
只创建一个单例列表和
<*>
产生一个函数对一个参数的每次成对应用的结果.尤其是
pure f <*> [1..10] :: [Int -> Int -> Int -> Int -> Int]
map f [1..10]
一起使用的函数列表(就像
<*>
)再次。
f
的其余论点不是listy,所以你需要
pure
他们。
pure f <*> [1..10] <*> pure 1 <*> pure 2 <*> pure 3 <*> pure 4
[f] <*> [1..10] <*> [1] <*> [2] <*> [3] <*> [4]
pure f <*> s
很常见,缩写为
f <$> s
, 所以
f <$> [1..10] <*> [1] <*> [2] <*> [3] <*> [4]
<$>
,
pure
和
<*>
噪音,它看起来像你想到的应用程序。额外的标点符号只是必要的,因为 Haskell 无法区分一组函数或参数的列表计算与预期作为单个值但恰好是列表的非列表计算之间的区别。但是,至少,组件是按照您开始时的顺序排列的,因此您可以更轻松地看到正在发生的事情。
(|f [1..10] (|1|) (|2|) (|3|) (|4|)|)
(|f a1 a2 ... an|)
表示将纯函数应用于成语中的零个或多个参数。这只是一种写作方式
pure f <*> a1 <*> a2 ... <*> an
f (range 1 10) 2 3 4
<*>
那样遍布整个内部。和
pure
.
关于haskell - 部分应用函数和柯里化(Currying),如何制作更好的代码而不是大量的 map ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33049909/
我是一名优秀的程序员,十分优秀!