我想做一些相当简单的事情; 我正在使用带有Data.Map insertWith的运算符(++),它工作正常,但我想消除创建的值中的重复,所以想要用nub组合它.
我试过(nub(++)),(nub $(++)),(nub.(++)),都无济于事,因为(++)的类型与预期的小块类型不匹配( [一个] ).
我当然可以定义一个辅助函数或一个lambda,但我认为可能有一个更清晰的组合.
请提示!
所以我有一个类型的两个参数的函数列表 [a -> a -> a]
我想编写一个函数,它将获取列表并将它们组成一个函数链,这些函数在左侧组成长度为+ 1的参数.例如,如果我有[f,g,h]所有类型,[a -> a -> a]我需要编写一个函数,它给出:
chain [f,g,h] = \a b c d -> f ( g ( h a b ) c ) d
Run Code Online (Sandbox Code Playgroud)
如果它有帮助,那么这些函数在它们的参数中是可交换的(即f x y = f y x对所有人而言x y).
我可以在列表理解中做到这一点,因为我知道有问题的函数的数量,它几乎就像定义一样.这是从固定数量的函数到动态数字的延伸,让我难以理解.
这是我到目前为止:
f xs = f' xs
where
f' [] = id
f' (x:xs) = \z -> x (f' xs) z
Run Code Online (Sandbox Code Playgroud)
我认为逻辑是沿着正确的道路,它只是不进行类型检查.
提前致谢!
所以,我真的在煎我的大脑,试着理解foldl.foldr的成分.这是一个例子:
(foldl.foldr) (+) 1 [[1,2,3],[4,5,6]]
Run Code Online (Sandbox Code Playgroud)
结果是22,但这里到底发生了什么?
对我来说,这就是发生的事情:foldl (+) 1 [6,15].我的疑问与该foldr部分有关.它不应该将1添加到所有子列表中吗?像这样:foldr (+) 1 [1,2,3].在我脑海中,1只添加了一次,是不是?(可能不是,但我想知道如何/为什么!).
我很困惑(也许让所有的困惑,哈哈).谢谢!
你能解释一下表达式的含义((.).(.))吗?据我所知(.)有类型(b - > c) - >(a - > b) - > a - > c.
只是想知道是否有一个语法快捷方式,用于获取两个proc并加入它们,以便将一个的输出传递给另一个,相当于:
a = ->(x) { x + 1 }
b = ->(x) { x * 10 }
c = ->(x) { b.( a.( x ) ) }
Run Code Online (Sandbox Code Playgroud)
有喜欢的东西时,这会派上用场method(:abc).to_proc,并:xyz.to_proc
我经常发现我想要编写两个函数f和g,但g需要多个参数.Haskell是否提供了一组操作符(我知道我可以自己编写它,但它看起来相当常见,我不想复制已经存在于Haskell中的运算符)
即类似的东西
(.@) = (.)
(.@@) f g x1 x2 = f $ g x1 x2
(.@@@) f g x1 x2 x3 = f $ g x1 x2 x3
(.@@@@) f g x1 x2 x3 x4 = f $ g x1 x2 x3 x4
...
Run Code Online (Sandbox Code Playgroud)
达到一些合理数量的论点
haskell operators currying variadic-functions function-composition
假设我想要Text.pack与之合作Text.strip.
:t (.) 生产: (b -> c) -> (a -> b) -> a -> c
:t (Text.pack) 生产: String -> Text
:t (Text.strip) 生产: Text -> Text
因此取代strip为(b -> c)给:
b = Text
c = Text
替换pack为(a -> b)得出:
a = String
b = Text
让我们验证::t strip . pack产生:
strip . pack :: String -> Text
好吧,太棒了试试看:
strip.pack " example "
生产:
Couldn't match expected type …Run Code Online (Sandbox Code Playgroud) 不可否认,我不确定我是否正确地将苹果与苹果或苹果与梨进行比较.但是我对这种差异的巨大性感到特别惊讶,如果有的话会有更小的差异.
管道通常可以表示为函数组合,反之亦然,我认为编译器也知道,所以我尝试了一个小实验:
// simplified example of some SB helpers:
let inline bcreate() = new StringBuilder(64)
let inline bget (sb: StringBuilder) = sb.ToString()
let inline appendf fmt (sb: StringBuilder) = Printf.kbprintf (fun () -> sb) sb fmt
let inline appends (s: string) (sb: StringBuilder) = sb.Append s
let inline appendi (i: int) (sb: StringBuilder) = sb.Append i
let inline appendb (b: bool) (sb: StringBuilder) = sb.Append b
// test function for composition, putting some garbage data in SB
let …Run Code Online (Sandbox Code Playgroud) 试图(.)用于功能组合,但它不起作用.
import Data.String (length, trim)
trimmedLength :: String -> Int
trimmedLength = length . trim
Run Code Online (Sandbox Code Playgroud) 我有以下功能:
f: a -> m[b]
g: (b,c) -> m[d]
h: (a,c) -> m[d]
Run Code Online (Sandbox Code Playgroud)
怎样才能h被表示为一个组成f和g?
使用do/for符号,我们可以h像这样轻松实现:
h: (a,c) => {
for {
b <- f(a)
d <- g(b,c)
} yield (d)
}
Run Code Online (Sandbox Code Playgroud)
但是,我很好奇我们是否可以这样表达:h = f andThen gwhereandThen像一元组合运算符一样使用。例如:
f: a -> m[b]
g: b -> m[c]
h: a -> m[c] = f andThen g
Run Code Online (Sandbox Code Playgroud)
我假设andThen在像 Haskell(例如 Kliesli >=>)这样的语言中创建这样的函数是可能的。在 Scala 中,我们可以这样写:(Scala 命名中的示例,andThenE因为 …
haskell ×7
currying ×2
combinators ×1
f# ×1
fold ×1
monads ×1
operators ×1
performance ×1
piping ×1
pointfree ×1
purescript ×1
ruby ×1
scala ×1
syntax ×1
types ×1