Haskell 与无点样式代码混淆
因此,一个将列表中的元素复制给定次数的函数如下所示Haskell 与无点样式代码混淆,haskell,pointfree,Haskell,Pointfree,因此,一个将列表中的元素复制给定次数的函数如下所示 rep :: Int -> [a] -> [a] rep = concatMap . replicate 根据定义(f.g)x=f(g(x))但是 (concatMap(replicate 4“abc”)的工作原理与(concatMap.replicate)4“abc”的工作原理不同。事实上,它根本不起作用。concatMap的第一个参数必须是function。我被这弄糊涂了。无点版本是如何工作的?有人能解释一下吗?你说得对,(f
rep :: Int -> [a] -> [a]
rep = concatMap . replicate
根据定义(f.g)x=f(g(x))
但是
(concatMap(replicate 4“abc”)
的工作原理与(concatMap.replicate)4“abc”的工作原理不同。事实上,它根本不起作用。concatMap的第一个参数必须是function。我被这弄糊涂了。无点版本是如何工作的?有人能解释一下吗?你说得对,(f.g)x=f(gx)
,但这并不意味着(concatMap.replicate)4“abc”=concatMap(replicate 4“abc”)
。相反,它意味着(concatMap.replicate)4“abc”=concatMap(replicate 4)“abc”
,这是真的。我想我在提问之前必须盯着类型签名看更长的时间replicate::Int->(a->[a]),concatMap::(a->[b])([a]->[b])
因此,为了匹配输入和输出,Haskell首先部分应用replicate 1参数。是这样吗?@Dulgunlst,不完全是这样。Haskell本身不适用任何东西。在这里工作的只是定义良好的应用程序规则。您刚刚编写了replicate
返回(a->[a])
和concatMap
接受(a->[b])
。这些类型是统一的(即假定b
等于a
),并且根据()
定义,您得到Int->([a]->[a])
类型的函数,这当然是Int->[a]->[a]
-您问题中的rep
类型。