标签: partial-application

为什么部分应用程序`foldr id` typecheck?

在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).相比之下,ida->a.它们不应该兼容.

haskell types type-inference partial-application fold

3
推荐指数
1
解决办法
256
查看次数

在scala中使用部分应用函数有哪些应用/优点?

我们在Scala中部分应用了函数 -

def sum(a:Int,b:Int,c:Int) = a+b+c

val partial1 = sum(1,_:Int,8)
Run Code Online (Sandbox Code Playgroud)

我想知道使用部分应用函数有什么好处.或者它只是一个语法上的添加?

scala partial-application

2
推荐指数
1
解决办法
522
查看次数

在Haskell中绑定部分应用的函数

我是Haskell的新手,所以如果你觉得这个问题很简单,请原谅我:

我如何让GHCi接受这种声明:let foo = fmap (*3) . fmap (+10)

我尝试向foo(let foo :: [Int] -> [Int] =etc)添加一个类型声明,使functor类型显式,但编译器响应Illegal Signature.

谢谢!

编辑 - 显然有很多方法可以做到这一点.我选择了Tikhon的答案,因为他是第一个,而且相当直观.感谢大家!

haskell partial-application

2
推荐指数
2
解决办法
174
查看次数

如何在Common Lisp中映射函数?

我在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

2
推荐指数
1
解决办法
492
查看次数

为什么部分应用程序需要指定参数类型?

为什么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)

为什么在这种情况下不推断类型?推断类型会导致复杂或模糊的语法,或者类型可能不像我看来那么清晰?

scala type-inference partial-application

2
推荐指数
1
解决办法
63
查看次数

`apply`模板用g ++编译,但不用clang ++和vc ++编译

以下代码在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 ++错误消息:

5 : <source>:5:15: error: too …
Run Code Online (Sandbox Code Playgroud)

c++ templates partial-application template-meta-programming variadic-templates

2
推荐指数
1
解决办法
210
查看次数

是"a - > b - >(a - > b - > c) - > c"应用两个参数标准功能概念吗?

我遇到了一个带签名的函数的需要,用于'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,所以最后两个参数必须HttpFuncHttpContext,由指定的TypeATypeB以上).

apply2具有签名的函数我已经描述了在函数式编程中使用的公平的东西,还是我错过了一些明显的东西?如果这是一个众所周知的概念,它有更好的名字吗?

f# functional-programming pipeline partial-application pipelining

2
推荐指数
1
解决办法
89
查看次数

将 map 与具有多个参数的函数一起使用

是否可以将 map 与带有多个参数的函数一起使用?

我想重复使用 map 的第二个和第三个参数作为函数的参数。如

mapF x y z = map (f y z) [1, 2, 3]
Run Code Online (Sandbox Code Playgroud)

因此,它会评估f与同yz的值,但x = 1x = 2x = 3等等。

haskell list partial-application higher-order-functions map-function

2
推荐指数
1
解决办法
4735
查看次数

增加值的函数如何工作?

经过多年的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 types function currying partial-application

2
推荐指数
1
解决办法
117
查看次数

没有因使用句法否定而产生的 (Num (Int -&gt; Int)) 实例

我编写了以下 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)

recursion haskell partial-application

2
推荐指数
1
解决办法
88
查看次数