是否有方法将字符“+”、“-”、“*”、“/”转换为相应的函数?我的意思是像这样的函数(很明显,我试过了,但没有起作用):
toOperator :: Num a => String -> a -> a -> a
toOperator c = read c :: Num a => a -> a -> a
此表达式在Haskell上有效吗?
(1,2,\_ ->3 )
我认为它是有效的,但当在GHCI前奏上尝试时,它给出了一个错误:
<interactive>:1:0:
No instance for (Show (t1 -> t))
arising from a use of `print' at <interactive>:1:0-12
Possible fix: add an instance declaration for (Show (t1 -> t))
In the expression: pri
我试图理解为什么fmap (+) (1)没有类型错误
我理解以下顺序:
Prelude> :t fmap
fmap :: Functor f => (a -> b) -> f a -> f b
Prelude> :t (+)
(+) :: Num a => a -> a -> a # like a-> b with b = a -> a
Prelude> :t fmap (+)
fmap (+) :: (Functor f, Num a) => f a -
我正在试图弄清楚,懒惰评估是如何工作的,我已经尝试了以下几点:
Prelude> a = [1,2,3,5,6]
Prelude> b = map (\x -> x * 8) a
Prelude> :sprint b
b = _
Prelude> b
[8,16,24,40,48]
Prelude> :sprint b
b = _
问题是,为什么最后一行没有显示评估列表?我之前评估过一行代码。
我为Int类型的向量定义了一个自定义类型:
data Vector = Vector Int Int Int
现在我想定义一个函数来向另一个函数中添加一个向量,但是语法是不正确的,尽管它非常类似于中使用的语法。
首先,使用前缀表示法:
Prelude> let vp :: Vector -> Vector -> Vector
Prelude| vp (Vector a b c) (Vector d e f) = Vector (a+d) (b+e) (c+f)
<interactive>:33:1: parse error on inpu
我发现
Prelude> :i ()
data () = () -- Defined in `GHC.Tuple'
instance Bounded () -- Defined in `GHC.Enum'
instance Enum () -- Defined in `GHC.Enum'
instance Eq () -- Defined in `GHC.Classes'
instance Ord () -- Defined in `GHC.Classes'
instance Read () -- Defined in `GHC.Read
是否可以在GHCi中编写带有类型签名的多行函数定义(就像在源文件中编写它一样)?
到目前为止,我已经尝试过这样的方法:
Prelude> :{
Prelude| let f :: Int -> Int;
Prelude| f i = i + 1
Prelude| :}
<interactive>:9:1: parse error on input ‘f’
但没成功..。还有什么我可以试试的吗?
我有以下数据类型:
data TestType a = TypeA a
| TypeB a
| TypeC a
如何简化下列函数的模式匹配:
f (TypeA x) (TypeB y) = "No"
f (TypeA x) (TypeC y) = "No"
f (TypeB x) (TypeA y) = "No"
f (TypeB y) (TypeC x) = "No"
f (TypeC y) (TypeA x) = "No"
f (TypeC y) (TypeB x) = "No
我试图为Moore自动机变压器导出一个分类实例,其中:
data Moore a b = Moore b (a -> Moore a b)
type MooreT a b c = (Moore a b -> Moore a c)
问题是,MooreT有3个参数,而Category只有2个。我试着编写:instance Category (MooreT a),但我没有工作。
问题是,参数a对于id和(.)的定义并不重要。例如:
id :: MooreT a b b
id x = x
有什么方法来定义这样的实例吗?还是必须为特定类型的MooreT (如type IntMooreT a
假设我们需要一组按需计算的值(计算有一些副作用),并且在再次访问它们时不再重新计算。
以下两种天真的方法行不通:
Prelude> let f x = print x >> return x
Prelude> let a = map f "abc"
Prelude> :t a
a :: [IO Char]
Prelude> head a
'a'
'a'
Prelude> head a
'a'
'a'
Prelude> let b = mapM f "abc
我试图利用Semigroup类型化来玩玩单子,并且我试图在自然数上定义一个单子。我将以下类和实例声明放入GHCI中
Prelude:{
Prelude| class Semigroup a where
Prelude| (<>) :: a -> a -> a)
Prelude| newtype Sum a = Sum { getSum :: a }
Prelude| deriving (Eq, Ord, Show)
Prelude| instance Num a => Monoid (Sum a) where
Prelude| (<>
我正在寻找与Java等效的Dhall,这样我就可以将一些原始的toString嵌入到另一个记录中,但我希望确保得到的JSON结构是有效的。
我有一条记录,例如{ name : Text, age : Natural },并希望将值转换为文本,例如:
let friends =
[ { name = "Bob", age = 25 }, { name = "Alice", age = 24 }]
in { id = "MyFriends", data = Record/toString friends }
这将产生以下结果:
{
"i
请考虑以下代码:
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeFamilyDependencies #-}
module Study where
class C a where
type T a = r | r -> a
pred :: T a -> Bool
pred _ = True
我希望有一个更有意义的pred默认定义,如下所示:
class C' a where
...
pred' = not . null
(我认为默认的T' a是= [a]。)
有办法吗
我正在尝试通过使用let和in来复制“学习Haskell以获得伟大的好处”这本书中的例子。
问题是,尽管我以相同的方式编写了相同的代码,但它不起作用,并向我显示了第二个变量中第二个"=“的失败。
有人能帮我解决这个问题吗?
cylinder :: (RealFloat a) => a ->a ->a
cylinder r h =
let sideArea = 2*pi*r*h
topArea = pi*r^2
in sideArea + 2*topArea
我正在学习Haskell,在使用的一个基本阶乘函数时遇到了麻烦。
基本上,我这样定义了一个阶乘:
Prelude> let factorial 0 = 1
Prelude> let factorial n = n * factorial (n - 1)
类型检出:
Prelude> :t factorial
factorial :: Num a => a -> a
这是有道理的。然而,这个函数的行为并不是这样的,不管输入是什么,它都会导致(interactive): out of memory。
Prelude> factorial 5
(interacti
可以为这个getConstructor函数提供一个类型签名吗?该函数可以工作,但我找不到编写返回类型的方法。 module Main where
data Letter a =
A a
| B a
| C String
deriving (Show)
-- getConstructor :: String -> (a -> Letter ?) -- <==
getConstructor x
| x == "a" = A
| x
在下面的代码中,我不得不使用elem'而不是简单的elem,因为序言已经有了一个函数elem,我如何在声明Tree模块时使用elem,从而避免冲突?
module Tree(Tree(..), singleton, insert, elem') where
data Tree a = Empty | Node a (Tree a) (Tree a) deriving (Show)
singleton :: a -> Tree a
singleton a = Node a Empty Empty
insert :: (Ord a) => a -> Tree
我定义了五个函数,它们在我看来应该是等价的(因此,它们具有相同的类型)。但推断的类型是不同的。我把下面的五行放在类型推断中:
f1 a b = a + b
f2 a = \b -> a + b
f3 = \a -> \b -> a + b
f4 a = (a+)
f5 = (+)
然后我开始拥抱:
Hugs> :load type-inference.hs
Main> :type f1
f1 :: Num a => a -> a -> a
Main> :type f2
f2 :: Num a => a -> a -> a
我正在创建一个名为Common.hs的文件,它导出我通常使用的函数。它还用我更喜欢的版本取代了Prelude的一些功能:
-- Common.hs
module Common
import qualified Prelude as Prelude
import qualified Data.Foldable as Foldable
sum = Foldable.sum -- I want to replace Prelude's sum
print = Prelude.print -- I want to export Prelude's print
ty
我正在尝试在ghci中以交互方式创建一个do块。只要我不用in块定义变量,就没问题:
Prelude>let a = do putStrLn "test"; putStrLn "other test"
Prelude>
但是我想不出如何在do块中以交互方式定义let构造而不出现解析错误:
Prelude> let a = do let b = 5; putStrLn $ show b
<interactive>:2:40:
parse error (possibly incorrect indentation or mis
在GHCi中:(>表示输出)
data Unit = Unit
let x = Unit
let y = ()
:p x
> x = (_t1::Unit)
:p y
> y = ()
:i ()
> data () = () -- Defined in `GHC.Tuple'
为什么Unit和()的行为不同?还有其他类似于()的类型,例如Int和Char。还有其他这样的类型吗?
令人惊讶的是,当我将()替换为undefined时,它的行为再次与我预期的一样:
let y = undefined :: ()
:p y
y = (_t2::())
GHCi告诉我A类型不是A类型。为什么?
>>> data A = A
>>> let x = A
>>> let id A = A
>>>
>>> data A = A
>>> let x' = A
>>> let id' A = A
>>>
>>> data A = A
>>>
>>> let y = id' x
<interactive>:18:13:
我所知道的唯一的“用户输入”函数是返回Strings --但通常(我会更频繁地说)我们希望读取数字或其他类型。
是否有:: IO a类型的函数或类似的函数来读取任意类型的值?对于这样的函数,我有,但是由于它不存在,或者由于有大量类似类型的其他函数,我没有发现任何东西。
它看起来很有用和简单,必须有一个内置的。我来得最近的地方是:
-- Eg.
get :: Read a => IO a
get = (liftM read) getLine
main = do
x <- get
print $ x + 5
有人知道为什么这个代码在GHCI中失败吗?
Prelude> let x = 4 in sum [(x^pow) / product[1.. pow] | pow <- [0.. 9]]
<interactive>:70:1:
No instance for (Fractional a0) arising from a use of ‘it’
The type variable ‘a0’ is ambiguous
我试着在哈斯克尔玩单曲游戏,使用这个页面:。我在终端中输入了以下信息(在导入Data.Monoid之后):
class Monoid a where
mempty :: a
mappend :: a -> a -> a
mconcat :: [a] -> a
mconcat = foldr mappend memptyhere
newtype Sum a = Sum { getSum :: a }
instance Num a => Monoid (Sum a) where
mempty = Sum 0
Sum x