【问题标题】:Haskell: How to return a random element that is not part of a listHaskell:如何返回不属于列表的随机元素
【发布时间】:2021-01-13 11:16:12
【问题描述】:

如何编写一个函数,将列表作为参数并返回一个不属于 Haskell 列表的随机元素?

randomElement [a", "b", "c"]

"z"-- returns any string except "a", "b", "c"

到目前为止,我已经编写了一个递归检查元素是否在列表中的函数。

inList _ [] = False
inList n (x:xs)
   | x == n = True
   | otherwise = inList x xs

但是我不知道如何修改此函数或如何编写一个附加函数,然后返回一个不是列表成员的元素。

【问题讨论】:

  • 你尝试了什么,什么不起作用?
  • 您需要更好地定义问题。 randomElement 应该如何知道可能结果的“宇宙”是什么?如果您要排除的列表等于全域会发生什么?另外,你知道System.Random这个包吗?
  • 字符串的一个简单答案:randomElement xs = 'A' : concat xs。这将始终输出一个不在xs 中的字符串。但大概这不是你的意思。
  • 还有一点:你的inList 函数是Prelude 中的elem。你函数的最后一行应该是| otherwise = inList n xs
  • @PaulJohnson: nitpick: randomElement [xs] == xs for xs = repeat 'A'

标签: list haskell


【解决方案1】:

这是一个基于对角化参数的解决方案,它表明String 不是可数无限的。与其他提议的解决方案不同,这个解决方案实际上保证它不同于传入列表中的任何元素,同时仍然足够懒惰以处理无限列表。

distinctHead :: String -> Char
distinctHead "" = 'a'
distinctHead ('a':_) = 'b'
distinctHead (c:_) = pred c

distinct :: [String] -> String
distinct = map distinctHead . zipWith drop [0..]

【讨论】:

  • 什么是'b'?它从何而来?我将这个问题解释为必须从我们作为论点给出的事物中构建答案。如果你引入特定类型的知识,当然你可以用它做很多很多事情。对于有限的输入,我的解决方案有效,而对于无限的输入,我觉得这是不可能的。
  • @WillNess 'b'Char。你的也使用特定类型的知识;我会问你的类似问题是“"random " 是什么?它来自哪里?”。无限输入并非不可能;这个说法很奇怪,因为这个答案显示了如何去做。
  • @WillNess 而且,对于它的价值,这个答案可以修改为distinct :: (Eq a, Big a) => [[a]] -> [a],其中Big 是一个类型类,证明一个类型至少有两个不同的元素;类似于class Eq a => Big a where big :: (a, a) 与法律fst big /= snd big。所以根本不需要太多特定类型的知识。
  • 是的,不知道我在想什么。 :( 我的回答也是如此,"random " ++...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-28
  • 2017-11-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多