我遇到了两个不同的Haskell模块之间的名称冲突,它们希望使用相同的中缀运算符(<*>)。Haskell 98的报告说
modid.varsym
是被允许的,但是我不能让它工作。下面是Test.hs的全部内容
module Test
where
import qualified Test2 as T
three = T.<*>
和Test2.hs
module Test2
where
(<*>) = 3
但是尝试编译时会出现一条错误消息:
Test.hs:6:12: parse error on input `T.<*>'
我试过T
我正在尝试使用Haskell的递归类型创建一个反向列表
data RevList a = Snoc a (RevList a) | Lin
deriving Show
mkrevlst [] = Lin
mkrevlst (x:xs) = mkrevlst xs Snoc x
当我执行> mkrevlst [1,2,3]时,我期望的输出是:((Lin Snoc 3) Snoc 2) Snoc 1
当我运行这个的时候,我得到了一个错误。我是Haskell的新手&我不知道哪里出了错。我哪里错了?
谢谢。
我试图让这段haskell代码正常工作,但是我总是收到这个错误消息:
> ERROR file:.\4.hs:9 - Type error in application
> Expression : fact n div (fact m * fact (n - m))
> Term : fact
> Type : Int -> Int
> Does not match : a -> b -> c -> d
代码如下:
fact :: Int -> Int
fact q
| q ==
我想在一个表达式中一次追加3个列表或更多列表。
a ++ b ++ c
++运算符是从左到右还是从右到左计算?
1. (a ++ b) ++ c
2. a ++ (b ++ c)
我会说选项2,因为如果++是一个前缀函数,我们会编写++ a ++ b c,这自然会导致首先计算++ b c。我不确定我是不是对的。
但如果是选项1,在我看来,从右到左明确地改变求值顺序会更有效率:
a ++ (b ++ c)
原因如下:a ++ b ++ c将首先在n步中求值为ab ++ c (其中n是a的长度,ab当然是a和b的串联),然后在更多的步长中求值为abc (m是b的长度,因此n+m是ab的长度),这使
我试图‘翻译’(我的意思是python可以理解的语言) '2x^2+3',我想得到'2*x^2 +3‘(这样python就可以理解它了)。
eq = '2x^2+3'
newlist = []
if '^' in eq:
eq = eq.replace('^', '**')
else:
print ''
for x in range (len(eq)):
newlist.append(eq [x])
print newlist
然后我得到了'2',
我想在SML中实现Option Monad,这样我就可以像在haskell中一样使用它们。我的所作所为,不起作用。
infix 1 >>=
signature MONAD =
sig
type 'a m
val return : 'a -> 'a m
val >>= : 'a m * ('a -> 'b m) -> 'b m
end;
structure OptionM : MONAD =
struct
type 'a m = 'a opti
我是Haskell的新手,我正在尝试理解这些基本的代码行。我有一个非常简单的主模块:
main = do
words <- readFile "test.txt"
putStrLn $ reverseCharacters words
其中reverseCharacters是在我拥有的另一个模块中定义的:
reverseCharacters :: String -> String
reverseCharacters x = reverse x
我很难理解的是为什么$需要出现在那里。我已经读过以前的帖子,也查过了,但我仍然无法理解这一点。任何
我在理解函数应用程序如何在haskell中使用currying时遇到了问题。如果我有以下函数:
($) :: (a -> b) -> a -> b
我知道要部分应用这个函数,我需要提供(a -> b)函数($的第一个参数)。
那么为什么可以先应用一个值(即反向参数)呢?
($ 0) :: Num a => (a -> b) -> b
这里我漏掉了什么?
我给this question提供了一个答案,于是我想到了使用Cont monad的想法。我对Haskell的了解还不足以解释为什么这个程序不能工作 import Control.Monad.Cont
fib1 n = runCont (slow n) id
where
slow 0 = return 0
slow 1 = return 1
slow n = do
a <- slow (n - 1)
b <- slow (n - 2)
return a + b
main = do
putStrLn $ sho
我正在学习Haskell。我正在导入Options.Applicative模块,如下所示:
import Options.Applicative ((<>), Parser)
import qualified Options.Applicative as P
但是,这将返回
Module ‘Options.Applicative’ does not export ‘(<>)’
这有什么问题呢?这个表明这应该是可能的。
我想为Haskell库中的一些标准函数创建Unicode别名。这是我的尝试。
{-# LANGUAGE UnicodeSyntax #-}
{-# LANGUAGE NoMonomorphismRestriction #-}
import qualified Data.List as List
import qualified Data.Map as Map
import qualified Data.Set as Set
-- Convenient aliases for common operations via Unicode symbols.
∩ = Set.intersec
什么是函数的有效名称?
示例
-- works
let µ x = x * x
let ö x = x * x
-- doesn't work
let € x = x * x
let § x = x * x
我不确定,但我的直觉是Haskell不允许使用Unicode函数名,不是吗?(像中的Unicode)
我一直想学习Haskell,所以最近我开始解决ProjectEuler问题。在编写以下分解代码时,我注意到调用(/ n)会返回一个Float,而调用(n `div`)会返回一个Int。我以为中缀符号只是Haskell中的语法糖?有人能解释一下是怎么回事吗?我也非常感谢您的任何意见/建议/改进,谢谢。
import Data.List (sort)
factor :: Int -> [Int]
factor 0 = [1..]
factor n =
let f1 = [f | f <- [1..limit], n `mod` f ==
一个系统有一个符号,它需要写一个像(A+B)*C这样的表达式作为#MUL(#ADD(A,B),C)。是否已经有一种算法可以进行这种符号转换,以便用户可以以更传统的方式输入?换句话说,这是一种从infix -> my notation转换的算法。第一个问题是我不知道我的符号的确切名称...它类似于反向抛光,但不完全是。每个运算符都编码为一个带参数的函数。