【问题标题】:Changing function definition to point-free style将函数定义更改为无点样式
【发布时间】:2015-10-27 22:18:05
【问题描述】:

我无法编写教授给我的代码:

编写一个名为digit7 的函数,它接受Int 并返回一个Bool,说明7 是否是其中一个数字。 (提示:使用show 将数字转换为字符列表。)使用digit7 创建一个 没有参数的函数称为square7,它返回最小的 正方形中包含 7 作为数字的数字。

我的代码是:

digit7 l = elem '7' (show l)

这可行,但我需要以无点风格编写的代码。我也无法弄清楚 square7 函数。

【问题讨论】:

    标签: haskell functional-programming pointfree


    【解决方案1】:

    对于digit7 函数,您可以使用函数组合将定义转换为无点样式:

    digit7 = (elem '7') . (show)
    

    这是因为:

       digit7 l
    -> ((elem '7') . (show)) l     By substitution
    -> (elem '7') ((show) l)       By definition of (.)
    -> elem '7' (show l)           By operator precedence
    

    至于square7函数,我推荐使用dropWhilehead

    【讨论】:

    • 当然,这里的括号是不必要的,在惯用的 Haskell 中可能会被省略,所以定义就是 elem '7' . show
    • 我同意。我想让初学者 100% 清楚 . 运算符所采用的参数。
    • 有效,但如果您简单解释一下最基本的规则会更好:中缀运算符ᴀʟᴡᴀʏꜱ的优先级低于函数应用程序
    • Haskell 给了我一个错误,我认为是类型错误。
    • 我发现代码出了什么问题。你写的一切都很好。我没有写任何类型签名,因为“show”函数是超多态的,如果不指定类型,它就无法正常工作。我只需要写 digit7 :: Int -> Bool.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-26
    • 1970-01-01
    • 1970-01-01
    • 2020-07-09
    相关资源
    最近更新 更多