在Elm中,如果我有一个匿名函数
monthName= 'january'
asci_letters = ['a' , 'b' , .... , 'z']
lst = list(monthName)
indxs = [i for i , _ in enumerate(monthName)]
oneLetter=[]
for i in indxs:
word = monthName
pos = list(word)
for j in asci_letters:
pos[i] = j
changed = ("".join(pos))
oneLetter.append(changed)
我可以将其简化为
(\f x -> f x)
对于双参数函数可以做同样的事情,其中参数是另一个函数的参数吗?
(<|)
我以为我可以简单地使用
(\x y -> f x y |> g)
但编译器抱怨类型。
具体来说,在我的(f |> g)
函数的一个案例中,我有类似的东西:
update
我正在尝试将let
msgNames = [Foo, Bar]
values = ["f", "b"] // These values are actually derived
// by a more complicated operation
model_ = List.map2 (<|) msgNames values
|> List.foldl (\msg mod -> update msg mod |> Tuple.first)
model
in
( model_, Cmd.none )
的匿名函数参数简化为类List.foldl
,但我从编译器中得到以下错误:
(update |> Tuple.first)
答案 0 :(得分:5)
我们可以按照以下几个步骤进行简化:
(\x y -> f x y |> g)
... can be written as
(\x y -> g (f x y))
... can be written as
(\x -> g << f x)
还有一个步骤让事情变得更加混乱:
(((<<) g) << f)
这与pointfree.io(使用.
运算符完成函数组合的Haskell)相匹配:
(g .) . f
如果您正在尝试提高可读性,您可能只想创建自己的中缀函数:
infixr 9 <<<
(<<<) : (c -> d) -> (a -> b -> c) -> (a -> b -> d)
(<<<) g f x y =
g (f x y)
现在你可以像这样使用它:
(g <<< f)