假设我有一个计算两个数字之和的函数:
computeSum :: Int -> Int -> Int
computeSum x y = x + y
Run Code Online (Sandbox Code Playgroud)
是否有任何形式的控制来自上述函数的返回值,我只想总结两个数字,其总和将是非负数且必须小于10?
我刚从命令式开始进行函数式编程,我们可以简单地检查函数返回值的命令式编程,例如:
if value <= 10 and value > 0:
return value
Run Code Online (Sandbox Code Playgroud)
只是想知道在haskell中是否有类似的东西?
基本上我正在尝试执行一个函数,在这个函数中给出一个列表和一个数字,你必须将列表拆分为与给定数字大小相同的列表,并且所有列表的最后一次拆分的长度都应该低于给定的数字
separa a xs = if length xs >= a then separaM a (drop a xs) ([take a xs]) else [xs]
separaM a xs yss = if length xs >= a then separaM a (drop a xs) (yss : (take a xs)) else separaM a [] (yss : xs)
separaM a [] yss = yss
Run Code Online (Sandbox Code Playgroud)
我希望3"comovais"的输出为["com","ova","is"]但是在我的程序中由于错误而没有输出
我得到的类型" Signal"只是一个双打列表,我想使用正常的列表操作,如本机上[Double].这应该是可能的,但它不会编译.您如何向编译器语法正确描述这一点.
这是测试代码:
data Signal = Signal [Double] deriving(Show, Eq)
test :: Signal
test = Signal [1.0,2.0,3.0]
take2 :: Signal -> Signal
take2 s = take 2 s
Run Code Online (Sandbox Code Playgroud)
预期: take2 test = [1.0,2.0]
实际:
"Couldn't match expected type ‘Signal’ with actual type ‘[a0]’
In the expression: take 2 s
In an equation for ‘take2’: take2 s = take 2 s"
Run Code Online (Sandbox Code Playgroud) 我需要在Haskell中编写一个函数,给定一个至少包含7个元素的列表,返回一个包含第一个和第七个元素的元组.
例如
Prelude> take1and7 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
(1, 7)
Run Code Online (Sandbox Code Playgroud)
我试过这个
take1and7 :: [a] -> (a, a)
take1and7 [a, b, c, d, e, f, g, xs] = (a, g)
Run Code Online (Sandbox Code Playgroud)
但它说它有"非详尽的模式",我不明白
syntax haskell functional-programming pattern-matching non-exhaustive-patterns
我试图在我的代码中加入错误处理.
我正在调用一个函数
generateCSR :: (MonadRandom m, HashAlgorithmConversion hashAlg, HashAlgorithm hashAlg)
=> X520Attributes -> PKCS9Attributes -> KeyPair -> hashAlg
-> m (Either Error CertificationRequest)
Run Code Online (Sandbox Code Playgroud)
所以我需要在这种情况下处理错误.我以为我可以做这样的事情
case generateCSR (parameters) of
Right req -> req
left Error -> putStrLn ("Error : " ++ show Error)
Run Code Online (Sandbox Code Playgroud)
但这似乎不起作用.
但如果我做这样的事情
Right req <- generateCSR (parameters)
putStrLn.show req
Run Code Online (Sandbox Code Playgroud)
它给了我一个输出.
如何在此处实现错误处理?我在第一种情况下(case of声明)做了一些完全错误的事情吗?
所以,我想prog使用>>/ >>=bindings而不是do和重写给定的函数<-:
prog :: IO Int
prog =
do putStrLn "Hello there! How old are you?"
age <- (readLn :: IO Int)
let agedays = show $ age * 365
putStrLn $ "So you are at least than " ++ agedays ++ " days old."
return (read agedays)
Run Code Online (Sandbox Code Playgroud)
重写更简单的功能对我来说不是问题,但是readLn :: IO Int让我头疼...
我的建议是:
prog :: IO Int
prog =
putStrLn "Hello there!How old are you?" >>
readLn::IO >>=
let …Run Code Online (Sandbox Code Playgroud) 以下代码旨在将布尔型的Church编码打印为Haskell的Bool:
{-#LANGUAGE FlexibleInstances #-}
instance Show (t -> t -> t) where
show b = show $ b True False
Run Code Online (Sandbox Code Playgroud)
导致此错误:
<interactive>:4:21: error:
• Couldn't match expected type ‘t’ with actual type ‘Bool’
‘t’ is a rigid type variable bound by
the instance declaration at <interactive>:3:10-27
• In the first argument of ‘b’, namely ‘True’
In the second argument of ‘($)’, namely ‘b True False’
In the expression: show $ b True False
• Relevant bindings include
b …Run Code Online (Sandbox Code Playgroud) 我正在从Haskell Wikibook看一个简单的IO程序。该页面上显示的构造效果很好,但是我试图理解“如何”。
writeChar下面的函数采用一个文件路径(作为字符串)和一个字符,并将该字符写入给定路径的文件中。该函数使用括号来确保文件正确打开和关闭。在方括号中进行的三个计算中,“在中间进行运算”(据我所知)是一个lambda函数,可返回的结果hPutChar h c。
现在,hPutChar它本身具有的声明hPutChar :: Handle -> Char -> IO ()。这是我迷路的地方。我似乎已经过关h了hPutChar。我希望一个句柄能以某种方式引用打开的文件fp,但相反,它似乎是递归调用lambda函数\h。我没有看到这个lambda函数调用自身递归是如何知道写c在文件fp。
我想了解为什么不应该阅读此函数的最后一行(\h -> hPutChar fp c)。尝试以这种方式运行它会导致“无法将类型'[Char]'与'Handle'匹配”,鉴于hPutChar期望使用Handle数据类型而不是字符串,因此我认为这是明智的。
import Control.Exception
writeChar :: FilePath -> Char -> IO ()
writeChar fp c =
bracket
(openFile fp WriteMode)
hClose
(\h -> hPutChar h c)
Run Code Online (Sandbox Code Playgroud) s和a是类型变量。在构造函数中,前两个参数是数据,然后是父级,在图形中的级别以及子级列表。
data Node s a = Root | Node s a (Node s a) Int [Node s a]
createRoot :: (ProblemState s a) => s-> a -> Node s a
createRoot state act= Node (state act Root 0 [])
Run Code Online (Sandbox Code Playgroud)
我已经将完全相同的5个参数传递给Node构造函数,但是我遇到了错误。
• Couldn't match expected type ‘Node s a’
with actual type ‘a1
-> Node s1 a1 -> Int -> [Node s1 a1] -> Node s1 a1’
• Probable cause: ‘Node’ is applied to too few arguments
In …Run Code Online (Sandbox Code Playgroud) 我正在使用Haskell编写程序,该程序需要简单的保存和加载功能。当我调用保存功能时,我需要将一个字符串放入文本文件中。调用load时,需要将字符串从文本文件中拉出。
我知道Haskell中围绕IO的复杂性。从网上的一些阅读中,我发现可以通过“主要”功能来实现。但是,我似乎只能实现保存或加载……不能同时实现。
例如,我目前具有以下功能,用于从文件读取。
main = do
contents <- readFile "Test.txt"
putStrLn contents
Run Code Online (Sandbox Code Playgroud)
我还如何实现写功能?是否必须在同一功能内?还是可以分开?另外,有没有办法让我命名函数load / save?当我实际上想调用“加载”或“保存”时必须调用“ main”是很烦的。
我在网上找不到有人同时实现这两个功能的任何示例,而我发现的任何一个实现都总是通过主要功能执行。
任何建议将不胜感激。