【发布时间】:2021-10-08 16:56:25
【问题描述】:
"使用下面的函数和两个参数:
nth :: (a,a,a,a,a) -> Int -> a
其中 Int 值应返回五元素元组的第 Int 值。” 我试过了:
nth (a,b,c,d,e) x = (a,b,c,d,e) !! x
但是 GHC 给了我一个错误信息:
file.hs:11:21: error:
* Couldn't match expected type `[a1]'
with actual type `(a, b, c, d, e)'
* In the first argument of `(!!)', namely `(a, b, c, d, e)'
In the expression: (a, b, c, d, e) !! x
In an equation for `nth':
nth (a, b, c, d, e) x = (a, b, c, d, e) !! x
* Relevant bindings include
e :: e (bound at file.hs:11:14)
d :: d (bound at file.hs:11:12)
c :: c (bound at file.hs:11:10)
b :: b (bound at file.hs:11:8)
a :: a (bound at file.hs:11:6)
nth :: (a, b, c, d, e) -> Int -> a1
(bound at file.hs:11:1)
我该怎么办?我应该如何写这个方程的元组部分? 提前感谢您的回答!
【问题讨论】:
-
实际上有一个简单的解决方法,您只需更改两个符号:
nth (a,b,c,d,e) x = [a,b,c,d,e] !! x。它可能不是一个有效的实现,但我认为 n-tuples 不应该是一个同构容器类型,也不是Int的有效随机访问。加上它很容易输入:) -
@Javran 当然它不是同质的,所以列表技巧根本行不通——你不能把不同的类型值放在一个列表中。
-
@WillNess 哪一部分不起作用?这个问题需要
nth :: (a,a,a,a,a) -> Int -> a类型的东西,我没有发现正确性问题。 -
@Javran 你是对的,我没有注意这部分并假设了一个更通用的类型。这也没有任何意义,因为我们必须返回 one 类型。哦! (我责怪睡眠不足;))-----您的答案丢失了。 :)
-
@WillNess 我最初只是想将其作为评论留下,因为我自己认为这只是一个技巧而不是“正确的方式”,但是是的,我认为我可以将其转换为详细说明一下。