Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如果Haskell使用“安全”将产生什么影响&引用;而不是关键字";不是";作为逻辑逻辑逻辑的运算符不是吗?_Haskell - Fatal编程技术网

如果Haskell使用“安全”将产生什么影响&引用;而不是关键字";不是";作为逻辑逻辑逻辑的运算符不是吗?

如果Haskell使用“安全”将产生什么影响&引用;而不是关键字";不是";作为逻辑逻辑逻辑的运算符不是吗?,haskell,Haskell,我是哈斯克尔的新学员。我不太了解Haskell背后的语法机制 在一些命令式编程语言(如C/Java)中,感叹号“!”用作逻辑而不是逻辑 同时,Haskell使用关键字“not”作为“logical not”。但是,Haskell使用“&&”和“| |”作为逻辑运算符 显然,Haskell避免使用“!”来表示“不”的概念,例如,“不相等”是“/=”但不是“!=” 从另一个角度来看,我想,如果将关键字“module”更改为“package”,那么除了将所有现有代码中的所有“module”更改为“pa

我是哈斯克尔的新学员。我不太了解Haskell背后的语法机制

在一些命令式编程语言(如C/Java)中,感叹号“!”用作逻辑而不是逻辑

同时,Haskell使用关键字“not”作为“logical not”。但是,Haskell使用“&&”和“| |”作为逻辑运算符

显然,Haskell避免使用“!”来表示“不”的概念,例如,“不相等”是“/=”但不是“!=”

从另一个角度来看,我想,如果将关键字“module”更改为“package”,那么除了将所有现有代码中的所有“module”更改为“package”之外,不会发生什么严重的事情

我想知道,如果在Haskell中将关键字“not”改为“!”,会发生什么

补充:

  • 正如@chi所指出的,我犯了一个错误。“not”不是一个关键字,它是一个库函数
  • 正如@user202729所指出的,我没有清楚地回答我的问题。我想知道当“not”替换为“!”时会发生什么。也就是说,当创始人设计Haskell时,他们使用“!”作为逻辑索引而不是逻辑索引,可能“!”不能用作数组索引。然后创始人尝试另一种方法来索引数组中的元素(使用[]?我不知道)。然后,类似连锁反应的事情发生了。这对哈斯克尔有很大影响吗

  • 如果您对后缀运算符感到满意,甚至可以尝试此操作,但这需要使用
    postfix运算符
    语言扩展

    {-# LANGUAGE PostfixOperators #-}
    
    (!) = not
    
    main = print (True !)
    -- False
    

    我觉得这是非常合理的,不是。

    Haskell没有一元前缀运算符,因此不能像其他所有运算符一样将其定义为库函数

    唯一的例外是,这是一种特殊的词汇攻击,用来回避人们期望能够写作的事实

    x = (-y) * 5
    
    然而,这样做的缺点是,
    (*5)
    是一个“部分”(即,一个二进制运算符给定一个参数并返回一个期望另一个参数的函数),
    (-y)
    不是一个部分,而是对
    y
    的求反

    如果你想把列表中的所有成员乘以5,你可以这样做

    xs = map (*5) ys
    
    但是,如果要从列表的所有成员中减去5,则此操作无效:

    xs = map (-5) ys
    
    相反,你必须写作

    xs = map (subtract 5) ys
    

    你说的“改变”是什么意思?从一开始就这样设计Haskell?相关:
    已用于数组索引。与所有符号运算符一样,它是一个二进制中缀运算符:
    arr!我
    不是
    在Haskell中不是一个关键字,事实上,这些都不是关键字:
    ==,/=,&&&,| |,我们两者都有,并且可以屏蔽或指定冲突名称。因此,对于一元运算符来说,唯一的变化是另一种特殊情况。我们仍然会有
    而不是
    。我是新来的。(!)似乎是运算符重载?然后我尝试:
    λ>:t(!):1:1-3:错误:变量不在范围内:加载示例代码后:
    λ>:t(!)(!)::Bool->Bool
    然后我尝试:
    λ>打印(True!)
    然后我收到一些令人困惑的错误消息:
    :72:8-13:错误:?无法将预期类型“t0->t1”与实际类型“Bool”匹配?运算符“(!)”有两个参数,但其类型“Bool->Bool”在“print”的第一个参数中只有一个参数,即表达式:print(True!)
    有什么想法吗?您的
    GHCi
    交互式提示符没有激活
    postfix运算符
    扩展名。试试
    :set-XPostfixOperators
    。那么,在当前的Haskell规则下,不可能将“not”替换为“!”,仅仅因为Haskell中只有一个一元前缀运算符“-”?这真的打破了我满脑子都是命令式编程语言的脑袋。我了解到重载运算符时,不能更改优先级和关联性。Haskell是真的吗?Haskell一般不做运算符重载(一元-是个例外),但允许您定义各种运算符,包括它们的优先级和关联性。类型类允许函数(包括运算符)对于不同的类型是不同的。对比C++,其中有一组预定义的33-39运算符,这些运算符是可重载的。@ AlohaWorld,当你定义一个运算符(注意它不是过载…在Haskell中,运算符只是一个函数名),你可以指定它的优先级和关联性,比如,<代码> InFixl 5 *< /Cord>。此外,运算符集不是固定的,如果愿意,可以定义名为
    (*$:$@^)
    的运算符。在Haskell中,可以将任意符号字符序列定义为运算符,就像可以将任意字母数字字符序列定义为函数名一样。还有一些保留运算符(如“=”),就像保留字一样。任何以“:”开头的运算符都是构造函数。运算符的优先级是使用中缀、中缀和中缀X关键字定义的,完全灵活。