gpt4 book ai didi

function - Haskell 使用 $ 代替括号无效

转载 作者:行者123 更新时间:2023-12-03 15:41:30 25 4
gpt4 key购买 nike

我是 Haskell 的新手。我想学习 $ 的用法,我写了两个小函数,但是第二个不起作用,有人可以解释一下那个小片段有什么问题吗?如果我理解正确,$ 就像括号一样工作。提前致谢 :)

myButLast::[a]->a
myButLast l = l !! (length l-2)

--not working
myButLast::[a]->a
myButLast l = l !! $ length l-2

最佳答案

If I understand it right $ is working like parentheses.


. ($) :: (a -> b) -> a -> b 不是一些特殊的语法,它只是一个像 (+) 这样的操作符, (-)或您自己定义的运算符。
之所以有效,是因为 infixr 0优先级,因此这意味着该运算符具有最低优先级,因此即使它们包含运算符,也会将左侧的元素分组在右侧,因为优先级会更高。 ($)本身实现为:
infixr 0  $

($) :: (a -> b) -> a -> b
($) f x = f x
因此它本质上是简单的函数应用,但是运算符优先级让它看起来好像左右操作数有隐藏的括号。
您的表达式的问题在于它现在包含两个接一个的运算符,实际上:
myButLast l = l !! $ length l-2
所以这意味着解析器感到困惑。
您可以使用运算符分段并构造函数 (l !!)然后使用运算符:
myButLast l = (l !!) $ length l-2
-- ↑ operator sectioning
但最好不要使用 length首先:通过使用长度,您将在列表上迭代两次:首先确定列表,然后获取最后一个索引。这是低效的,并且可能还会导致使用大量内存。
您可以通过以下方式简化此操作:
myButLast :: [a] -> a
myButLast (x:x2:xs) = go xs x x2
where go [] y _ = y
go (y2:ys) _ y = go ys y y2
myButLast _ = error "empty list"

关于function - Haskell 使用 $ 代替括号无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65344321/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com