我想做一些相当简单的事情; 我正在使用带有Data.Map insertWith的运算符(++),它工作正常,但我想消除创建的值中的重复,所以想要用nub组合它.
我试过(nub(++)),(nub $(++)),(nub.(++)),都无济于事,因为(++)的类型与预期的小块类型不匹配( [一个] ).
我当然可以定义一个辅助函数或一个lambda,但我认为可能有一个更清晰的组合.
请提示!
我想以某种方式撰写功能.请考虑伪代码中的这两个函数(不是F#)
F1 = x + y
F2 = F1 * 10 // note I did not specify arguments for F1, 'reverse curry' for lack of a better word
Run Code Online (Sandbox Code Playgroud)
我希望F#做的是弄清楚,因为
let F1 x y = x + y
//val F1 : int -> int -> int
Run Code Online (Sandbox Code Playgroud)
代码let F2 = F1 * 10会给我与F1:相同的签名val F2 : int -> int -> int,并且调用F2 2 3将导致50:(2 + 3)*10.这将是相当聪明的...
发生的事情是完全不同的.第一行符合预期:
let F1 x y = x + y
//val F1 : …Run Code Online (Sandbox Code Playgroud) 我在这里阅读,我注意到,例如,如果我有以下函数定义:
a :: Integer->Integer->Integer
b :: Integer->Bool
Run Code Online (Sandbox Code Playgroud)
以下表达式无效:
(b . a) 2 3
Run Code Online (Sandbox Code Playgroud)
组合的功能必须只有一个参数,这很奇怪.
这个限制是因为在Haskell中定义最通用的一个问题还是有其他原因?
我是Haskell的新手,所以我问的也许是无用的问题.
我现在正在学习haskell,并试图找出前缀、中缀、优先级等的所有规则。
在尝试实现一个附加两个列表并对它们进行排序的函数时,我从以下开始:
appendAndSort :: [a] -> [a] -> [a]
appendAndSort = sort . (++)
Run Code Online (Sandbox Code Playgroud)
它不编译。
下列的:
appendAndSort :: Ord a => [a] -> [a] -> [a]
appendAndSort = (sort .) . (++)
Run Code Online (Sandbox Code Playgroud)
另一方面确实有效。
为什么我必须在排序时添加第二个点并在其周围添加括号?