gpt4 book ai didi

haskell - 一元类型混淆

转载 作者:行者123 更新时间:2023-12-04 13:34:50 25 4
gpt4 key购买 nike

我正在经历Write Yourself a Scheme in Haskell .这是一个很棒的教程,但我遇到了 parsing exercises 之一:

parseNumber :: Parser LispVal
parseNumber = liftM (Number . read) $ many1 digit

使用以下方法重写 parseNumber:
  • 符号
  • 使用 >>= 运算符的显式排序

  • 我对 do-notation 没有任何问题:
    parseNumber :: Parser LispVal
    parseNumber = do x <- many1 digit
    let y = read x
    return $ Number y

    对于#2,我尝试了很多变体,例如:
    parseNumber :: Parser LispVal
    parseNumber = (many1 digit) >>= (liftM (Number . read))

    但我一直遇到类型错误。我有两个问题。
  • 为什么我会收到类型错误?我误解了单子(monad)绑定(bind)运算符吗?
  • 为什么我的 do-notation 解决方案没有出现类似的类型错误?

  • 我觉得我缺少关于类型的基本概念?

    最佳答案

    您正在尝试从 do-notation 到 bind notation 的非平凡转换,我建议以“平凡”的方式进行,然后使其无积分。

    记起:

    x <- m === m >>=\x ->
    让 x = e === 让 x = e 在

    然后你有:

    parseNumber = many1 digit >>=\x ->
    让 y = 读入 x
    返回(数字 y)

    (我删除了 $ 以避免出现优先级问题。)

    然后我们可以将其转换为:

    parseNumber = many1 digit >>=\x -> return (Number (read x))
    = many1 digit >>= return .数字 。读

    现在,如果你想使用 liftM ,您需要停止使用绑定(bind),因为提升的函数需要一个单子(monad)值作为其参数。

    parseNumber = liftM (Number . read) (many1 digit)

    关于haskell - 一元类型混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5320528/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com