【问题标题】:Issue with function signature函数签名问题
【发布时间】:2013-10-08 07:00:54
【问题描述】:

我正在编写一个函数,它获取一个列表,检查其中的所有元素是否恰好一次在另一个列表中。我的尝试:

cA = ['A', 'B', 'C', 'D'] {- original list -}

validate :: [Char] -> Bool
validate (n:[]) = if length (filter n cA) == 1 then True else False
validate (n:m) = if length (filter n cA) == 1 then validate m else False

返回

应用程序中的类型错误 * 表达式:过滤器 n cA 术语:n 类型:字符 * 不匹配:Char -> Bool

想法?

【问题讨论】:

  • filter n cA 要求 n 是一个函数,但您提供了一个 Char。您可以通过将 n 替换为 (==n) 来做到这一点。
  • 迷路了,什么是(==n)?
  • (==n)m==n 的一部分 - 与 (==) m n 相同。这里(==) 是两个参数的函数,所以(==n) 是一个参数的函数,如果m==n 给定m,则生成True

标签: haskell


【解决方案1】:

首先,如果你看到自己在写作,你会很生气

if foo then True else False

停下来写

foo

其次,n 的类型是Char 对吗?但过滤器期待Char -> Bool。所以这是你的错误。我相信你想要

validate [n] = length (filter (==n) cA) == 1
validate (n:ns) = length (filter (==n) cA) == 1 && validate ns

(==n)\a -> a == n 相同。这称为操作符部分,它只是一些很好的旧 Haskell 糖。

哦,这可以使用函数all来编写

validate ns = all (\n -> length (filter (==n) cA) == 1) ns
validate' = all $ (==1) . length . flip filter cA . (==)

【讨论】:

  • 谢谢! :D 那行得通!还有一个问题,是否有一些巧妙的方法可以在函数中包含检查两个列表的长度是否相等?
  • @DarioP 哪两个列表?
  • 用于调用“过滤器”的cA列表和作为验证函数参数给出的原始列表
  • @DarioP 在递归函数中很棘手,因为validate 将被调用,并带有原始列表的所有尾部,在all 版本中,只需添加length ns == length cA && ...
  • @DarioP 底部的那个validate ns = length ns == length cA && all ...
猜你喜欢
  • 1970-01-01
  • 2011-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多