点(.)和美元符号有($)什么区别?据我了解,它们都是不需要使用括号的语法糖.
我一直在阅读真实世界的哈斯克尔,我即将结束,但风格问题一直在与我(.)和($)操作员徘徊.
当你编写一个由其他函数组成的函数时,你可以这样写:
f = g . h
Run Code Online (Sandbox Code Playgroud)
但是当你在这些函数的末尾应用某些东西时,我会这样写:
k = a $ b $ c $ value
Run Code Online (Sandbox Code Playgroud)
但是这本书会像这样写:
k = a . b . c $ value
Run Code Online (Sandbox Code Playgroud)
现在,对我来说,他们看起来功能相同,他们在我眼中完全一样.然而,我看的越多,我就越看到人们以书的方式编写他们的函数:(.)首先构成,然后仅在最后使用($)附加值来评估该批次(没有人用很多美元组成) .
是否有理由使用比使用所有($)符号更好的书籍方式?或者这里有一些我没有得到的最佳实践?或者它是多余的,我根本不应该担心它?
该功能const在Prelude中定义为:
const x _ = x
Run Code Online (Sandbox Code Playgroud)
在GHCi,当我尝试
Prelude> const 6 5 -> Gives 6
Run Code Online (Sandbox Code Playgroud)
但是当我尝试的时候
Prelude> const id 6 5 -> Gives 5
Run Code Online (Sandbox Code Playgroud)
即使在做出改变之后
Prelude> (const id 6) 5 -> Gives 5
Run Code Online (Sandbox Code Playgroud)
这个函数不应该给出函数6的输出id有id :: a -> a应该绑定的类型
Prelude> (const 6) 5 -> Gives 6
Run Code Online (Sandbox Code Playgroud)
为什么函数const表现不同?
(.)采用两个函数,它们接受一个值并返回一个值:
(.) :: (b -> c) -> (a -> b) -> a -> c
Run Code Online (Sandbox Code Playgroud)
既然(.)有两个参数,我觉得(.).(.)应该是无效的,但它完全没问题:
(.).(.) :: (b -> c) -> (a -> a1 -> b) -> a -> a1 -> c
Run Code Online (Sandbox Code Playgroud)
这里发生了什么?我意识到这个问题措辞严厉......所有的功能都只是因为讨论而采取了一个论点.也许更好的方式来说它是类型不匹配.
我对Haskell和FP很新.我已经阅读了许多描述currying的文章,但我还没有找到它如何实际工作的解释.
这里是一个功能:(+) :: a -> (a -> a)
如果我这样做(+) 4 7,该函数将4返回一个函数,7并返回11.但是会发生什么4?第一个功能是做什么用的4?怎么(a -> a)办7?
当我考虑更复杂的功能时,事情变得更加混乱:
max' :: Int -> (Int -> Int)
max' m n | m > n = m
| otherwise = n
Run Code Online (Sandbox Code Playgroud)
什么(Int -> Int)比较它的参数?它只需要一个参数,但它需要两个参数m > n.
我正在做一些练习,我必须添加一个函数的类型并解释它的作用.我坚持这个:
phy = uncurry ($)
Run Code Online (Sandbox Code Playgroud)
据GHCi说,这种类型phy :: (a -> b, a) -> b.我的haskell知识是基本的,所以我真的不知道它的作用.
如何结合使用$和无点风格?
一个明显的例子是以下效用函数:
times :: Int -> [a] -> [a]
times n xs = concat $ replicate n xs
Run Code Online (Sandbox Code Playgroud)
只是写入concat $ replicate产生错误,类似的是你不能写concat . replicate,因为concat期望值而不是函数.
那么你如何将上述功能转变为无点风格呢?
我正在学习haskell,我遇到了这个我无法理解的表达方式.
(flip const 1 . const flip 3 const 4) 5
Run Code Online (Sandbox Code Playgroud)
最终的结果是5,但我不知道它是如何评估的.
是否有更好的方式来表达(\(a, b) -> a < b)功能组合?我觉得我错过了一些东西,curry只是试着让我更加困惑.