【问题标题】:Using Haskell signature to create function through different types使用 Haskell 签名通过不同类型创建函数
【发布时间】:2015-10-07 02:20:18
【问题描述】:

我是 Haskell 的新手,我一直在尝试制作此功能 g :: a -> b -> [(b,a)]

我通过这个得到了类型结果[(b,a)](不完全是): [(length a , a)].

从未正确地进行签名,尤其是从类型a 传递到b

在这个特定的功能上将近 6 个小时无法弄清楚。有人能帮我吗? 请注意,我是一个真正的初学者,所以如果可能并且不要求太多,请坚持基础知识。 提前谢谢了。

【问题讨论】:

  • 你的函数的目的是什么? g ab = repeat (b,a) 具有所需的类型,并返回由第二个参数和第一个参数组成的元组的无限列表。
  • 几乎可以做任何我们想做的事,唯一的捕获必须有确切的签名。我不明白的是重复是如何从 a -> b -> [(b,a)] 开始的。非常感谢您的评论。
  • 在 ghci 中,输入 :t repeat 它会告诉你类型 (a -> [a]) ... 所以它接受一个类型并返回该类型的列表 .... 所以我们需要重复输入为 (b,a) 类型,它将返回类型 [(b,a)]
  • 嗯,g a b = [] 的定义满足类型签名。这有帮助吗?注意——它可能不满足赋值条件,但是如果你声明g :: a -> b -> [(b,a)],类型检查器不会报错。
  • 另外,这个问题不是很好...如果您不了解类型签名,请询问您对类型签名不了解的具体问题...。这将永远不会对其他人有用。

标签: function haskell types signature


【解决方案1】:

也许你可以从更简单的类型开始

g' :: a -> b -> (b,a)

可以理解为 g' 接受两个参数并以相反的顺序返回它们的元组。

现在,将其扩展到元组列表

g :: a -> b -> [(b,a)]

有普通情况[]、单例情况[(b,a)] 与单个元素、无限情况或列表中任何其他任意数量的元素。例如,

doublePair :: Int -> Int -> [(Int,Int)]
doublePair x y = [(y,x),(y,x)]

【讨论】:

  • 谢谢@karakfa。顺便问一下=>->有什么区别,比如g :: Ord a => [a] -> a -> bool
  • 你问的很有趣,今天回答了同样的问题,这里stackoverflow.com/a/32974148/1435869
  • 太好了,明白了!谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-01
  • 2011-06-13
  • 1970-01-01
相关资源
最近更新 更多