在Haskell中,我不明白为什么部分应用程序会出现问题foldr id.
相关类型是
> :t foldr id
foldr id :: a -> [a -> a] -> a
> :t foldr
foldr :: (a -> b -> b) -> b -> [a] -> b
> :t id
id :: a -> a
Run Code Online (Sandbox Code Playgroud)
第一个论点foldr是(a->b->b).相比之下,id是a->a.它们不应该兼容.
我们在Scala中部分应用了函数 -
def sum(a:Int,b:Int,c:Int) = a+b+c
val partial1 = sum(1,_:Int,8)
Run Code Online (Sandbox Code Playgroud)
我想知道使用部分应用函数有什么好处.或者它只是一个语法上的添加?
我是Haskell的新手,所以如果你觉得这个问题很简单,请原谅我:
我如何让GHCi接受这种声明:let foo = fmap (*3) . fmap (+10)?
我尝试向foo(let foo :: [Int] -> [Int] =etc)添加一个类型声明,使functor类型显式,但编译器响应Illegal Signature.
谢谢!
编辑 - 显然有很多方法可以做到这一点.我选择了Tikhon的答案,因为他是第一个,而且相当直观.感谢大家!
我在Common Lisp中创建了这个函数
(defun f (&key n p x)
(* (combinacion n x) (expt p x) (expt (- 1 p) (- n x))))
Run Code Online (Sandbox Code Playgroud)
它工作正常.问题是我想在Common Lisp湖中使用以下Haskell函数
ff n p x = sum . map (f n p) $ [0 .. x]
Run Code Online (Sandbox Code Playgroud)
namley,将f部分应用的功能映射到列表.
我创建了以下函数来创建列表
(defun range (&key max (min 0) (step 1))
(loop for n from min to max by step
collect n))
Run Code Online (Sandbox Code Playgroud)
并且工作正常,我只需要知道如何进行映射.
lisp functional-programming common-lisp map partial-application
为什么Scala中的部分函数应用程序需要提供类型,如:
def func(a: Int, b: Int) = ???
def func1 = func(_ : Int, 1) // compiles fine
def func1x = func(_, 1) // does not compile
// error: missing parameter type for expanded function ((x$2) => func(x$2, 1))
Run Code Online (Sandbox Code Playgroud)
为什么在这种情况下不推断类型?推断类型会导致复杂或模糊的语法,或者类型可能不像我看来那么清晰?
以下代码在g ++ 7.2.0(编译标志)中成功编译,但无法在clang ++ 5.0.0(具有相同的标志)和vc ++ 15.4(编译标志)中编译:-std=c++14 -Wall -Wextra -Werror -pedantic-errors-std=c++14 -Wall -Wextra -Werror -pedantic-errors/EHsc /Za /std:c++14 /permissive-
template <template <typename...> class Functor, typename... FixedArguments>
struct apply
{
template <typename... FreeArguments>
using type = Functor<FixedArguments..., FreeArguments...>;
};
template <typename, typename>
struct Bar{};
template <template <typename...> class>
struct Foo{};
int main()
{
(void)Foo<apply<Bar, int, char>::type>{};
}
Run Code Online (Sandbox Code Playgroud)
哪种编译器行为符合标准?如何修改这样的模板apply以便在clang ++上编译?
clang ++错误消息:
Run Code Online (Sandbox Code Playgroud)5 : <source>:5:15: error: too …
c++ templates partial-application template-meta-programming variadic-templates
我遇到了一个带签名的函数的需要,用于'a -> 'b -> ('a -> 'b -> 'c) -> 'c在管道时应用两个参数:
let apply2 x y f =
f x y
Run Code Online (Sandbox Code Playgroud)
我需要这个因为我正在使用一个函数
myFun : MyType -> TypeA -> TypeB -> ResultType
Run Code Online (Sandbox Code Playgroud)
我在另一个函数中使用它:
let useCase someValue (valueA: TypeA) (valueB: TypeB) =
someValue
|> ...
|> toMyType
|> myFun
|> apply2 valueA valueB
Run Code Online (Sandbox Code Playgroud)
apply2符合条件,但我不能动摇我可以使用内置函数或运算符的感觉,或者我错过了一些更基本的方法(禁止使用lambda,在这种情况下恕我直言的内容更糟).请注意,我不能轻易切换的参数顺序myFun(这是一个长颈鹿HttpHandler,所以最后两个参数必须HttpFunc和HttpContext,由指定的TypeA和TypeB以上).
apply2具有签名的函数我已经描述了在函数式编程中使用的公平的东西,还是我错过了一些明显的东西?如果这是一个众所周知的概念,它有更好的名字吗?
f# functional-programming pipeline partial-application pipelining
是否可以将 map 与带有多个参数的函数一起使用?
我想重复使用 map 的第二个和第三个参数作为函数的参数。如
mapF x y z = map (f y z) [1, 2, 3]
Run Code Online (Sandbox Code Playgroud)
因此,它会评估f与同y和z的值,但x = 1,x = 2,x = 3等等。
haskell list partial-application higher-order-functions map-function
经过多年的OOP,我正在努力学习haskell.我正在读Happy Haskell.它提供了以下代码:
plus :: Int -> Int -> Int
plus x y = x + y
plus' :: Int -> Int -> Int
plus' = \x -> \y -> x + y
increment :: Int -> Int
increment = plus 1
increment' :: Int -> Int
increment' = (\x -> \y -> x + y) 1
Run Code Online (Sandbox Code Playgroud)
我理解加号和加号是如何工作的(它们是相同的,不同的语法).但增量,我不明白.
increment :: Int -> Int
Run Code Online (Sandbox Code Playgroud)
意味着它需要一个int,并返回一个int,对吗?但就在那之后,实际的功能是:
increment = plus 1
Run Code Online (Sandbox Code Playgroud)
题:
整数值增量在哪里?标志x右边是否应该有一个或=哪些东西表示该函数作为输入的整数值?就像是:
increment _ = plus 1 x
Run Code Online (Sandbox Code Playgroud)
编辑:另外,不应该是增量的定义, …
我编写了以下 Haskell 代码来返回 [[Int]] 的主要和次要对角线
getDiagonal' :: [[Int]] -> Int -> (Int -> Int) -> [Int]
getDiagonal' [] _ _ = []
getDiagonal' (x:xs) i fn = i' : getDiagonal' xs (fn i) fn
where i' = head $ drop i x
getPrimaryDiagonal :: [[Int]] -> [Int]
getPrimaryDiagonal x = getDiagonal' x 0 (+1)
getSecondaryDiagonal :: [[Int]] -> [Int]
getSecondaryDiagonal x = getDiagonal' x ((length x) - 1) (+(-1))
Run Code Online (Sandbox Code Playgroud)
但是,我会认为最后一行可能是以下内容,使用(-)与(+)
getSecondaryDiagonal x = getDiagonal' x ((length x) …Run Code Online (Sandbox Code Playgroud)